关于等于实现的C#不同的MSDN指南
为什么下面的文档在实现Equals
方法时谈论不同的方法?关于等于实现的C#不同的MSDN指南
[MSDN]
Guidelines for Overriding Equals() and Operator == (C# Programming Guide)[MSDN]
Implementing the Equals Method
第二份文件(这是最近的)没有明确执行的Equals
(如public bool Equals(MySuperTrooperClass o)
)的强类型版本。
从一个指导方针中删除强类型方法,以及我应该在生产代码中使用哪种方法的根本原因是什么?
删除强类型版本没有任何好处。恰恰相反,作为第一个页面本身提到
它也建议,除了实现equals (对象),任何类也实现了自己的类型, 等于(型),以提高性能。
这对于值类型是双重的。
我认为第二页完全不涉及这一点,因为只有弱类型的版本在System.Object
上定义。强类型版本通常与执行IEquatable<T>
,documentation结合使用,其中提到了Equals(T)
和Equals(object)
之间的交互。
您应该实施强类型Equals以提高性能。正如它是写在第一篇文章中
当你要检查两件事情有使用==
当你要检查两件事情实际上refrencing你使用等于同一个实例相同的值( )。
请记住,只有Equals()为true,==也必须为true。
关于GetHashCode() - 在某些情况下包含诸如Dictionary这样的结构,请使用此特定方法来区分数据。决定如何区分数据取决于您,但GetHashCode()不得在被更改为正确的对象的值时更改。这意味着它应该在物体寿命期间保持相同的值。
当你做财产以后这样的:
MyClass A = new MyClass();
MyClass B = A;
当你检查,如果(A == B)你居然检查指针地址具有相同的值指针B地址。
因此,您不需要在99.99%的通用开发中实现Equals()。
微软决定在许多原始类型超载Equals
的不幸的副作用是,有很多情况下,即使((Object)X).Equals(Y)
将表现为一个等价关系(应该如此),因为隐式转换的,X.Equals(Y)
不会。例如,3.Equals(3.0)
将返回false,但(3.0).Equals(3)
将返回true。虽然==
运算符并不是很差(通常如果是X==Y
,Y==X
)它仍然没有指定等价关系(例如,如果X = Int64.MaxValue,Y = X-1和Z =(Double)X,则X == Z和Y == Z,但是X!= Y)。
也许,微软放弃了咨询关于提供的Equals()
其行为相同Equals(Object)
超载的原因是,虽然隐式转换可能使前者不能表现为一种等价关系,后者应该表现为一个等价关系,用没有例外。
只有当类型实现IEquatable时,才会使用强类型。奇怪的是,这些指南都没有提到IEquatable ...... –