簡體   English   中英

用一個字段覆蓋 class 中的 Equals 和 GetHashCode

[英]Override Equals and GetHashCode in class with one field

我有一個 class:

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
我認為這不足以重載方法(正確地)。
如何識別對象?

一方面,您可以簡化兩種方法:

 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 ,然后應用它們自己的邏輯。

AbstractDictionaryObject而言,具有相同LangIdDerived1的兩個實例將是等價的,而Derived2的兩個實例也是如此——但它們彼此不同,因為它們具有不同的類型。

如果您想給他們不同的 hash 代碼,您可以GetHashCode()更改為:

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

但是,不同對象的 hash 代碼不必不同……它只是有助於提高性能。 如果您知道您擁有具有相同LangId的不同類型的實例,您可能想要這樣做,但否則我不會打擾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM