使用一个字段在类中覆盖Equals和GetHashCode

时间:2011-08-10 05:28:10

标签: c# override equals gethashcode

我有一个班级:

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 我认为这不足以超载方法(正确) 我如何识别物体?

1 个答案:

答案 0 :(得分:6)

首先,您可以简化两种方法:

 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,然后应用自己的逻辑。

Derived1的两个LangId实例与AbstractDictionaryObject相同,Derived2的两个实例也是如此 - 但它们会有所不同因为他们有不同的类型。

如果您想为他们提供不同的哈希码,可以GetHashCode()更改为:

 public override int GetHashCode()
 {
     int hash = 17;
     hash = hash * 31 + GetType().GetHashCode();
     hash = hash * 31 + LangId;
     return hash;
 }

但是,不同对象的哈希码不会 不同......它只是有助于提高性能。如果您知道具有相同LangId的不同类型的实例,则可能需要执行此操作,否则我不会打扰。