关于等于实现的C#不同的MSDN指南

关于等于实现的C#不同的MSDN指南

问题描述:

为什么下面的文档在实现Equals方法时谈论不同的方法?关于等于实现的C#不同的MSDN指南

第二份文件(这是最近的)没有明确执行的Equals(如public bool Equals(MySuperTrooperClass o))的强类型版本。

从一个指导方针中删除强类型方法,以及我应该在生产代码中使用哪种方法的根本原因是什么?

+0

只有当类型实现IEquatable 时,才会使用强类型。奇怪的是,这些指南都没有提到IEquatable ...... –

删除强类型版本没有任何好处。恰恰相反,作为第一个页面本身提到

它也建议,除了实现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)超载的原因是,虽然隐式转换可能使前者不能表现为一种等价关系,后者应该表现为一个等价关系,用没有例外。