gpt4 book ai didi

c# - 用一个字段覆盖类中的 Equals 和 GetHashCode

转载 作者:行者123 更新时间:2023-12-05 00:07:17 24 4
gpt4 key购买 nike

我有一个类:

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中只有一个公共(public)字段: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 然后应用他们自己的逻辑。

Derived1 的两个实例具有相同的 LangIdAbstractDictionaryObject 而言是等价的, 的两个实例也是如此>Derived2 - 但它们将彼此不同,因为它们具有不同的类型。

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

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

但是,不同对象的哈希码不必不同...它只是有助于提高性能。如果您知道您拥有具有相同 LangId 的不同类型的实例,您可能想要这样做,否则我不会打扰。

关于c# - 用一个字段覆盖类中的 Equals 和 GetHashCode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7006298/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com