我使用 ReSharper 生成相等成员。它将选择性地实现IEquatable<T>
如果你想要的话,也可以覆盖运算符(当然你永远不会这样做,但无论如何它很酷)。
Equals 的实现包括重写Object.Equals(Object)
,以及强类型变体(可以避免不必要的类型检查)。较少类型的版本在执行类型检查后调用强类型的版本。强类型版本执行引用相等性检查(Object.ReferenceEquals(Object,Object)
),然后比较所有字段的值(好吧,仅比较您告诉生成器包含的字段)。
As for GetHashCode
,该领域的智能因式分解GetHashCode
值被合并(使用unchecked
如果您使用编译器,以避免溢出异常checked
选项)。每个字段的值(第一个字段除外)在组合之前都会乘以素数。您还可以指定哪些字段永远不会为空,并且它将删除任何空检查。
这就是你得到的Polygon
按类ALT+Insert
然后选择“产生平等成员":
public class Polygon : IEquatable<Polygon>
{
public Point[] Vertices { get; set; }
public bool Equals(Polygon other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return Equals(other.Vertices, Vertices);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != typeof (Polygon)) return false;
return Equals((Polygon) obj);
}
public override int GetHashCode()
{
return (Vertices != null ? Vertices.GetHashCode() : 0);
}
}
我上面谈到的一些功能并不适用,因为只有一个字段。还要注意,它没有检查数组的内容。
但总的来说,ReSharper 在短短几秒钟内就生成了大量优秀的代码。在我列出的使 ReSharper 成为如此令人惊叹的工具的功能列表中,该功能相当靠后。