代码检查:使用默认相等性成员的结构用于比较(私有可访问性)
此检查报告没有 Equals/GetHashCode 重写的结构类型,并且这些类型在当前本地范围内有 使用。 此类结构的使用可能会对性能产生负面影响。
在下面的示例中, MyPoint 结构被用作 Points 字典中的键。 这意味着 Points 的使用将隐式导致调用 次优的默认实现Equals/GetHashCode:
要解决此性能问题,您可以通过快速修复在结构中生成 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 ,以捕获类似问题。