比较两个值是否相等的最高效的方法是什么?

时间:2011-07-04 10:59:27

标签: c# .net generics boxing

假设我在C#中有一个泛型方法,它接受两个类型为T的值:

public void M<T>(T a, T b)
{
    ...
}

M()的内部体我想比较两个输入值的相等性。由于我对它们的运行时类型一无所知,除了它们是相同的类型,我可以使用object.Equals()静态方法做到这一点,并让它选择最佳方式:

public void M<T>(T a, T b)
{
    if (object.Equals(a, b))
    {
        ...
    }
    else
    {
        ...
    }
}

当T不是引用类型时,我在这里看到的问题是两个值的不必要的装箱。我想避免这种惩罚,因为M()被频繁调用。

我的问题是:有更好的方法可以解决这个问题吗?我显然对一个解决方案很感兴趣,这个解决方案不会过多地分析前面的T,这会抵消拳击逃避带来的收益。

TIA。

1 个答案:

答案 0 :(得分:7)

if(EqualityComparer<T>.Default.Equals(a,b))
{...}

这可以使用IEquatable<T>来避免装箱,并处理值类型,引用类型和“解除”对Nullable<T>的使用,以避免在几乎所有情况下装箱。

IEquatable<T> 可用时,它必须推迟到object.Equals,因此可能会发生值类型的装箱。