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

aov*_*ven 2 .net c# generics boxing

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

public void M<T>(T a, T b)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

public void M<T>(T a, T b)
{
    if (object.Equals(a, b))
    {
        ...
    }
    else
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我的问题是:有没有更好的方法来解决这个问题?我显然对一个解决方案感兴趣,这个解决方案不会过多地分析前面的T,这将抵消拳击规避的收益.

TIA.

Mar*_*ell 7

if(EqualityComparer<T>.Default.Equals(a,b))
{...}
Run Code Online (Sandbox Code Playgroud)

IEquatable<T>可用于避免装箱,并处理值类型,引用类型和"提升"用法,Nullable<T>以避免在几乎所有情况下装箱.

如果IEquatable<T>没有用,就必须服从object.Equals,所以可能会出现价值类型的拳击.