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

时间:2010-11-04 12:23:31

标签: c#

是否所有c#类都重写Equals和GetHashCode?为了正确

5 个答案:

答案 0 :(得分:10)

不,他们已经这样做了。

是否必须覆盖它们,取决于它的使用方式。在大多数情况下,不需要它。

答案 1 :(得分:3)

所有类都已从基类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

答案 2 :(得分:2)

所有要从System.Object继承此内容的类。

如果需要为类提供特定的Equals或GetHashCode,则应覆盖类中的方法。否则就离开他们..

http://msdn.microsoft.com/en-us/library/system.object.gethashcode(v=VS.71).aspx

答案 3 :(得分:0)

也许不是全部,但是所有将被放入某种包(IList,ICollection,IDictionary,Hashset等)的类并需要一些简单的方法来区分它们(只需考虑Sort()Contains()BinarySearch()等。)

如果你以这种方式使用课程,你绝对应该实施正确

答案 4 :(得分:0)

  

基本上覆盖Equals时。   当你想提供不同的   平等的想法比简单的参考   平等。

     

字符串就是一个很好的例子 - 两个   字符串相等(简单   等于电话)如果他们代表   相同的字符序列。哈希   代码反映了这一点,如果两个   字符串是相同的,他们将拥有   相同的哈希码。 (反过来不是   必然是真的 - 两个不相等的字符串   可以有相同的哈希码,但它是   不可能的。)

     

(字符串在其他方面很棘手,   请注意 - 有很多不同的东西   基于文化和文化的平等观念   套管,但String.Equals只是看起来   在UTF-16代码点上   字符串,并将它们进行比较   最简单的可想象的时尚。)

     

by Jon Skeet