![](/img/trans.png)
[英]Equals/GetHashCode override warning in derived class with no state
[英]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;
}
但到那時應該沒問題。 如果兩個派生類有其他字段,它們應該自己重寫GetHashCode
和Equals
,首先調用base.Equals
或base.GetHashCode
,然后應用它們自己的邏輯。
就AbstractDictionaryObject
而言,具有相同LangId
的Derived1
的兩個實例將是等價的,而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.