[英]Performance of == vs Equals in generic C# class
出于某种原因,C#不允许在这样的泛型类中使用==运算符:
class Mine<T> where T : struct
{
T val;
public T Value
{
set
{
if (val == value) // Operator '==' cannot be applied to operands of type T and T happens here
{
// .. do something ...
}
}
}
}
如果我用val.Equals(value)替换==我有代码按预期工作但如果我看字节码它看起来要复杂得多。 使用==和Equals()比较循环中的int变量的一个非常简单的测试表明,Equals()版本比“==”版本慢两倍。
我想知道是否有一种方法来比较泛型类中的原始值类型,这些类型与==运算符一样快。 欢迎任何想法。
编辑:我在计时器之间迷路了。 性能差异并不那么显着。 这是我最新的结果:
== operator 1974380 ticks
Equals() 1976358 ticks
== operator in another static function 1974604 ticks
EqualityComparer<int>.Default... 32486695 ticks
简而言之:Equals()足够好了。
如果允许将IEquatable<T>
约束添加到类中,则可以使用该接口中声明的IEquatable<T>.Equals(T other)
方法:
class Mine<T> where T : struct, IEquatable<T>
{
T val;
public T Value
{
set
{
if (val.Equals(value)) //
{
// .. do something ...
}
}
}
}
原因是==
默认引用相等而且对值类型没有意义,答案总是false
。 因为没有语言机制来基于静态方法来约束泛型类型,所以编译器完全不允许这样做,因为它无法验证T
是否真的有一个重载的==
运算符。
另一方面,如果你将T
约束到class
,它将编译得很好,因为引用相等确实对引用类型有意义。
解决方案当然是IEquatable<T>
; 在任何IEquatable<T>.Equals(T t)
实现的结构中IEquatable<T>.Equals(T t)
将为您提供值相等语义,并且==
应该表现一致。
并回答你的问题,不,没有。 如果你真的需要int == int
的速度,你需要实现一个非通用的专用类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.