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.
if(EqualityComparer<T>.Default.Equals(a,b))
{...}
Run Code Online (Sandbox Code Playgroud)
这IEquatable<T>可用于避免装箱,并处理值类型,引用类型和"提升"用法,Nullable<T>以避免在几乎所有情况下装箱.
如果IEquatable<T>是没有用,就必须服从object.Equals,所以可能会出现价值类型的拳击.
| 归档时间: |
|
| 查看次数: |
179 次 |
| 最近记录: |