用一个字段重写类中的Equals和GetHashCode

本文关键字:Equals GetHashCode 重写 字段 一个 | 更新日期: 2023-09-27 18:04:54

我有一个类:

public abstract class AbstractDictionaryObject
    {
        public virtual int LangId { get; set; }
        public override bool Equals(object obj)
        {
            if (obj == null || obj.GetType() != GetType())
            {
                return false;
            }
            AbstractDictionaryObject other = (AbstractDictionaryObject)obj;
            if (other.LangId != LangId)
            {
                return false;
            }
            return true;
        }
        public override int GetHashCode()
        {
            int hashCode = 0;               
            hashCode = 19 * hashCode + LangId.GetHashCode();
            return hashCode;
        }

我有派生类:

public class Derived1:AbstractDictionaryObject
{...}
public class Derived2:AbstractDictionaryObject
{...}

AbstractDictionaryObject中只有一个公共域:LangId
我认为这不足以(正确地)重载方法。
我如何识别物体?

用一个字段重写类中的Equals和GetHashCode

可以简化这两个方法:

 public override bool Equals(object obj)
 {
     if (obj == null || obj.GetType() != GetType())
     {
         return false;
     }
     AbstractDictionaryObject other = (AbstractDictionaryObject)obj;
     return other.LangId == LangId;
 }
 public override int GetHashCode()
 {
     return LangId;
 }

但是在那一点上它应该是好的。如果两个派生类有其他字段,它们应该覆盖GetHashCodeEquals自己,首先调用base.Equalsbase.GetHashCode,然后应用自己的逻辑。

两个具有相同LangIdDerived1实例就AbstractDictionaryObject而言是等价的,两个Derived2实例也是等价的——但是它们将彼此不同,因为它们具有不同的类型。

如果你想给他们不同的哈希码,可以改变GetHashCode()为:

 public override int GetHashCode()
 {
     int hash = 17;
     hash = hash * 31 + GetType().GetHashCode();
     hash = hash * 31 + LangId;
     return hash;
 }
然而,不同对象的哈希码并不要求是不同的…它只是对性能有帮助。如果您知道具有相同LangId的不同类型的实例,您可能想要这样做,但否则我不会麻烦。