繁体   English   中英

所有c#类应该实现Equals和GetHashCode吗?

[英]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代码点,并在最简单的情况下对它们进行比较可以想象的时尚。)

作者:Jon Skeet

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM