gpt4 book ai didi

c# - 等于方法实现助手 (C#)

转载 作者:太空狗 更新时间:2023-10-29 18:28:27 24 4
gpt4 key购买 nike

每次我写一些数据类时,我通常会花很多时间编写 IEquatable 实现。

我写的最后一节课是这样的:

public class Polygon
{
public Point[] Vertices { get; set; }
}

实现 IEquatable 非常耗时。当然,C#3.0/LINQ 有很大帮助,但顶点可以移动和/或以相反的顺序排列,这给 Equals 方法增加了很多复杂性。经过多次单元测试和相应的实现后,我放弃了,并将我的应用程序更改为仅接受三角形,IEquatable 实现只需要 11 个单元测试就可以完全覆盖。

有什么工具或技术可以帮助实现 Equals 和 GetHashCode?

最佳答案

我使用 ReSharper 生成相等成员。它将有选择地实现 IEquatable<T>以及覆盖运算符(如果您需要的话)(当然您永远不会这样做,但无论如何它都很酷)。

Equals 的实现包括对 Object.Equals(Object) 的覆盖,以及强类型变体(可以避免不必要的类型检查)。类型较少的版本在执行类型检查后调用强类型版本。强类型版本执行引用相等性检查 ( Object.ReferenceEquals(Object,Object) ),然后比较所有字段的值(好吧,只有那些你告诉生成器包含的字段)。

至于GetHashCode ,该领域的智能分解 GetHashCode值被组合(如果使用编译器的 unchecked 选项,则使用 checked 以避免溢出异常)。每个字段的值(除了第一个)在合并之前都乘以质数。您还可以指定哪些字段永远不会为空,并且它会放弃任何空检查。

这是您的 Polygon 的结果按 ALT+Insert 上课然后选择“Generate Equality Members”:

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 成为如此出色的工具的因素列表中,该功能非常靠后。

关于c# - 等于方法实现助手 (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/962960/

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