JetBrains Rider 2025.2 Help

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

此检查报告了 使用未覆盖 Equals/GetHashCode 的结构类型。 此类结构的使用可能会对性能产生负面影响。

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

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

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

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

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

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

有关更多信息,请参阅 Microsoft Developer Support:C# 中默认结构相等性的性能影响

相等性检查 API

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

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

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