ReSharper 2025.2 Help

代码检查:默认结构相等性的使用

此检查报告 使用未覆盖 等于/获取哈希码 的结构类型。 此类结构的使用可能会对性能产生负面影响。

在下面的示例中, 字典使用 我的点 结构作为键。 这意味着 的使用将隐式导致调用 次优的默认实现等于/获取哈希码

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

要解决此性能问题,您可以通过快速修复在结构中生成 等于/获取哈希码 实现,或者将您的 结构体 声明更改为 记录结构体 ,这将强制 C# 编译器为您生成良好的 等于/获取哈希码 实现。

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

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

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

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

相等性检查 API

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

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

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