假设我在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。
答案 0 :(得分:7)
if(EqualityComparer<T>.Default.Equals(a,b))
{...}
这可以使用IEquatable<T>
来避免装箱,并处理值类型,引用类型和“解除”对Nullable<T>
的使用,以避免在几乎所有情况下装箱。
当IEquatable<T>
不可用时,它必须推迟到object.Equals
,因此可能会发生值类型的装箱。