在POCO单位域上是等价的

本文关键字:位域 POCO 单位域 | 更新日期: 2023-09-27 18:10:50

我从SQL Server数据库有一个身份ID字段的POCOs。我想实现等价,这样我就可以检查它们是否相同的记录,在List<T>上使用.Contains()等。

假设我永远不需要比较未保存的实例,仅仅使用

实现是否足够:
    public bool Equals(MyClass other)
    {
        return this.ID == other.ID;
    }
    public override int GetHashCode()
    {
        return this.ID;
    }

我即将这样做,但只是想检查这是好的,因为我不是100%确定GetHashCode与它有什么关系,或者如果有任何其他考虑因素(如"未保存的实例"一个,我可以丢弃),我不知道。

在POCO单位域上是等价的

当你覆盖Equals()时,你需要覆盖GetHashCode()(当你实现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(); 
}

在这种情况下,您可能还应该覆盖==!=操作符。如果您希望区分具有相同ID的两个不同引用,则始终可以使用Object.ReferenceEquals()

如果根据您的业务规则,您的对象在ID相等时彼此相等,那么您就可以做得很好!

对象的哈希码状态,每个具有不同状态的对象应该返回不同的哈希码。这个哈希码不是唯一的,但我们可以尝试使它们尽可能不同。请查看字符串"Hello".GetHashCode()"Goodbye".GetHashCode()的哈希码。

HashCode在某些集合中使用,如System.Collections.Generic.Dictionary<K,V>System.Collections.Generic.HashSet<T>。通过使用这个哈希码,这些字典可以通过使用这个"唯一的"哈希码非常快地搜索和找到一个项目(几乎是O(1)个操作)。使用您的实体的字段的哈希码来计算这个哈希码。

如果你实现了IEquatable<T>.Equals,也要覆盖Equals(object)