什么意思是“您不应在可变引用类型上覆盖等于”?

时间:2019-02-11 22:36:46

标签: override equals mutable reference-type

我在MSDN文章“ https://docs.microsoft.com/en-us/dotnet/api/system.object.equals?redirectedfrom=MSDN&view=netframework-4.7.2#System_Object_Equals_System_Object_”中碰到了这句话

引用类型准则 您不应在可变引用类型上覆盖Equals。这是因为覆盖Equals要求您还覆盖GetHashCode方法,如上一节所述。这意味着可变引用类型的实例的哈希码在其生命周期内可能会发生变化,这可能导致对象在哈希表中丢失。

我真的很困惑。例如,下面的Person类是可变对象。

在同一篇文章中,给出了此示例,并重写了Equal方法。这对我来说很有意义,但是为什么在同一篇文章中,它被告知“ 您不应在可变引用类型上覆盖Equals。

public class Person
{
   private string idNumber;
   private string personName;

   public Person(string name, string id)
   {
      this.personName = name;
      this.idNumber = id;
   }

   public override bool Equals(Object obj)
   {
      Person personObj = obj as Person; 
      if (personObj == null)
         return false;
      else
         return idNumber.Equals(personObj.idNumber);
   }

   public override int GetHashCode()
   {
      return this.idNumber.GetHashCode(); 
   }
}

0 个答案:

没有答案