ReSharper 2025.2 Help

代码检查:使用默认相等性成员的结构用于比较(非私有可访问性)

此检查报告了没有 Equals/GetHashCode 重写的结构类型,并且这些类型在当前解决方案中有 使用。 此类结构的使用可能会对性能产生负面影响。

在下面的示例中, MyPoint 结构被用作 Points 字典中的键。 这意味着 Points 的使用将隐式导致调用 次优的默认实现Equals/GetHashCode

public class Test { public Dictionary<MyPoint, string> Points = new(); } public struct MyPoint { public int X, Y; // No Equals/GetHashCode overrides }

要解决此性能问题,您可以通过快速修复在结构中生成 Equals/GetHashCode 实现,或者将您的 struct 声明更改为 record struct ,这将强制 C# 编译器为您生成良好的 Equals/GetHashCode 实现。

结构中 Equals/GetHashCode 默认实现的性能问题

自 .NET Framework 1.0 引入以来,.NET 类型系统通过 struct 关键字为 C# 提供了对值类型的支持。 为了确保结构类型表现得像值一样,定义 结构性相等性对于此类类型非常重要,以便任何两个结构实例在其对应字段的值也相等时应被视为等价。 为了满足此要求,.NET 运行时为所有结构类型提供了 Equals/GetHashCode 虚方法的默认实现,这些实现通常可以完成其工作。

然而,运行时提供的 Equals/GetHashCode 默认实现存在显著问题。 为了处理所有可能的结构类型, Equals/GetHashCode 的实现涉及装箱分配(以获得结构值的统一表示为托管引用)并依赖反射机制获取字段值。 此外,默认的 GetHashCode 实现使用第一个非空引用类型字段的哈希代码,如果您的结构包含多个字段,这可能导致较差的哈希代码分布。 因此,如果在应用程序的关键执行路径中检查结构性相等性,定义您自己的 Equals/GetHashCode 实现可能至关重要。

有关更多信息,请参见 Microsoft Developer Support: Performance implications of default struct equality in C#

相等性检查 API

仅当未实现 Equals/GetHashCode 的结构通过实际在底层执行相等性检查的 API 使用时,才会报告此问题。

ReSharper 知晓系统和流行库中大多数此类 API 模式。 对于自定义 API,您可以使用 [DefaultEqualityUsageAttribute] ,来自 JetBrains.Annotations ,以捕获类似问题。

最后修改日期: 2025年 9月 27日