GetHashCode()
每当您覆盖时都需要覆盖Equals()
(在实现时也应该这样做IEquatable<T>
),以便依赖它的类(例如 Dictionary<TKey, TValue>
)可以正确处理它。这是令人讨厌的泄漏的内部细节之一。更多信息。
至于比较您的 ID 是否足以确定相等性,如果您绝对确定具有相同 ID 的两个实体在所有情况下都应该被视为等效,那么就去做吧。这是一个只有您的应用程序要求才能回答的问题。我自己已经做过很多次了,几乎总是使用只读实体。
我会这样实现它:
// IEquatable<MyClass> implementation
public bool Equals(MyClass other)
{
if (other == null)
{
return false;
}
return this.ID == other.ID;
}
// Override of default Object.Equals()
public override bool Equals(object other)
{
return this.Equals(other as MyClass);
}
public override int GetHashCode()
{
// Call ID.GetHashCode() because ID may not always be int,
// and the ID type might have a more useful implementation
// of GetHashCode() to offer.
return this.ID.GetHashCode();
}
在这种情况下,您可能还应该覆盖==
and运算符。如果您想区分具有相同 ID 的两个不同引用,!=
您可以随时使用。Object.ReferenceEquals()