[英]should all c# classes implement Equals and GetHashCode?
是否所有c#类都重写Equals和GetHashCode? 为了正确
不,他们已经做到了。
是否必须覆盖它们,取决于它将如何使用。 在大多数情况下,不需要它。
所有类都已从基类System.Object继承这些方法。
如果需要能够比较对象的两个实例而不是简单的引用相等性,则可以选择覆盖派生类中的方法,否则就没有必要。
但请记住,如果您选择覆盖其中一个,则还需要覆盖另一个,以确保Hashtables和字典键(以及其他功能)与您的派生类一起正常工作。 GetHashCode方法需要反映与Equals方法相同的逻辑。 有关更多说明和示例,请参见此处:
http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx
和
http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx
从System.Object
继承此类的所有类。
如果需要为类提供特定的Equals或GetHashCode,则应覆盖类中的方法。 否则就离开他们..
http://msdn.microsoft.com/en-us/library/system.object.gethashcode(v=VS.71).aspx
也许不是全部,但所有类都将被放入某种包(IList,ICollection,IDictionary,Hashset等)并需要一些简单的方法来区分它们(只需考虑Sort()
, Contains()
, BinarySearch()
等)。
如果你以这种方式使用一个类,你肯定应该正确地实现它们。
当你重写
Equals
,基本上。 当你想提供一个不同的平等概念而不是简单的引用平等。String就是一个很好的例子 - 如果它们代表相同的字符序列,则两个字符串相等(在简单的Equals调用下)。 哈希码反映了这一点,这样如果两个字符串相等,它们将具有相同的哈希码。 (反过来不一定正确 - 两个不相等的字符串可以具有相同的哈希码,但不太可能。)
(字符串在其他方面很棘手,请注意 - 基于文化和套管有很多不同的平等概念,但
String.Equals
只是查看构成字符串的UTF-16代码点,并在最简单的情况下对它们进行比较可以想象的时尚。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.