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

时间:2012-05-17 09:30:44

标签: c# equals equality msdn

为什么以下文档在实施Equals方法时会讨论不同的方法?

第二个文档(更近期)没有明确实现Equals的强类型版本(如public bool Equals(MySuperTrooperClass o))。

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

4 个答案:

答案 0 :(得分:3)

删除强类型版本没有任何好处。恰恰相反,正如第一页本身提到的那样

  

除了实施Equals之外,还建议使用   (对象),任何类也为它们自己的类型实现Equals(type),   提高绩效。

对于价值类型来说,情况更是如此。

我认为第二页完全没有涉及到这一点,因为System.Object上只定义了弱类型的版本。强类型版本通常与实施IEquatable<T>密切相关,documentation提及Equals(T)Equals(object)之间的互动。

答案 1 :(得分:1)

微软决定在许多原始类型中重载Equals的一个不幸的副作用是,在许多情况下,即使((Object)X).Equals(Y)将表现为等价关系(它应该),因为隐式转换,X.Equals(Y)不会。例如,3.Equals(3.0)将返回false,但(3.0).Equals(3)将返回true。虽然==运算符不是很糟糕(通常是X==YY==X),但它仍然没有指定等价关系(例如,如果X = Int64.MaxValue,Y = X -1,Z =(Double)X,然后X == Z和Y == Z,但X!= Y)。

也许微软放弃了关于提供与Equals()行为相同的Equals(Object)重载的建议的原因是,虽然隐式转换可能使前者无法表现为等价关系,后者应该表现为等价关系,没有例外。

答案 2 :(得分:0)

您应该实现强类型Equals以提高性能。正如它在第一篇文章中所写

答案 3 :(得分:0)

如果要检查两件事物是否具有相同的值,请使用==
如果要检查两个内容是否实际上正在重新引用到同一个实例,请使用Equals()。

请记住,只有当Equals()为true时,==也必须为true。

关于GetHashCode() - 在某些情况下包含诸如Dictionary之类的结构使用这种特定方法来区分数据。您可以决定如何区分数据,但是当更改对象的值以使其正常工作时,不得更改GetHashCode()。这意味着它应该在对象生命周期内保持相同的值。

当你做那样的事情时:

MyClass A = new MyClass();
MyClass B = A;

检查是否(A == B)实际检查指针A地址是否与指针B地址具有相同的值。
因此,您不需要在99.99%的常见开发中实现Equals()。