为什么以下文档在实施Equals
方法时会讨论不同的方法?
[MSDN]
Guidelines for Overriding Equals() and Operator == (C# Programming Guide) [MSDN]
Implementing the Equals Method 第二个文档(更近期)没有明确实现Equals
的强类型版本(如public bool Equals(MySuperTrooperClass o)
)。
将强类型方法从一个指南中删除的基本原因是什么,我应该在生产代码中使用哪种方法?
答案 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==Y
,Y==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()。