ReSharper 2025.2 Help

生成相等比较器

IEqualityComparer<T> 是一个通用的 .NET 接口,允许为集合实现自定义的相等比较。

为您的类型创建一个比较器类是 创建 Equals() 和 GetHashCode() 方法 的替代方案。 生成的比较器类将实现 IEqualityComparer<T> 接口,并提供自定义的 Equals()GetHashCode() 方法。

ReSharper 提供了 生成相等比较器 命令,用于自动生成比较器类。

在下面的示例中,此命令用于基于 _radius_center 字段生成比较器类。

生成前

生成后

class Circle { int _radius; Point _center; }
class Circle { int _radius; Point _center; private sealed class RadiusCenterEqualityComparer : IEqualityComparer<Circle> { public bool Equals(Circle x, Circle y) { if (ReferenceEquals(x, y)) return true; if (ReferenceEquals(x, null)) return false; if (ReferenceEquals(y, null)) return false; if (x.GetType() != y.GetType()) return false; return x._radius == y._radius && x._center.Equals(y._center); } public int GetHashCode(Circle obj) { unchecked { return (obj._radius*397) ^ obj._center.GetHashCode(); } } } private static readonly IEqualityComparer<Circle> RadiusCenterComparerInstance = new RadiusCenterEqualityComparer(); public static IEqualityComparer<Circle> RadiusCenterComparer { get { return RadiusCenterComparerInstance; } } }

生成一个相等比较器类

  1. 在编辑器中,将插入点放在类型名称上或类型内您希望插入相等比较器类的行上。 如果插入符号位于类型名称上,生成的代码将添加到类型声明的开头。

  2. Alt+Insert 或从主菜单中选择 ReSharper | 编辑| 生成代码…。 或者,您可以按 Control+Shift+A ,在弹出窗口中开始输入命令名称,然后在那里选择它。

  3. 生成 弹出窗口中,选择 相等比较器

  4. 在出现的 生成 对话框中,选择要在比较器类中使用的字段。

    使用 ReSharper 生成相等比较器

    如果您的类型中没有字段/属性,或者您未选择任何字段/属性,根据设置,ReSharper 将抛出新的 NotImplementedException() ,返回默认值,或在生成的方法体中放置无法编译的代码。 您可以在 ReSharper 选项的 代码编辑 | 成员生成 页面上配置设置。

    可选地,在对话框中使用以下控件:

    • 字段可以为 null — 如果您的类型中有任何可为空的字段或属性,则会显示。 默认情况下,此复选框是选中的,这意味着 ReSharper 将为选定的字段生成空值检查。 如果您不需要空值检查,可以取消选中此复选框。

    • 字符串比较 — 如果您的类型中有任何字符串字段,将会出现。 ReSharper 将为选定的字符串生成 string.Compare(string, string, StringComparison) ,并且选择器可让您选择为 StringComparison 参数生成的值。

    • 通过静态属性公开 — 将比较器类设为私有,并生成一个静态属性以将比较器类暴露给使用者。

    • 比较器名称前缀 — 允许您指定将在生成的比较器类名中使用的前缀。

  5. 单击 完成 完成向导。

    您还可以单击 选项 ,在 ReSharper 选项的 代码编辑 | 成员生成 页面上查看或修改通用代码生成首选项。

或者,您可以编写一个实现 IEqualityComparer<T> 的空比较器类,然后从 Alt+Enter 菜单中选择相应的快速修复。

ReSharper:生成相等比较器快速修复

此功能在以下语言和技术中 受支持

语言:C#

语言:VB.NET

语言:C++

语言:ASP.NET

语言:Razor

语言:XAML

语言:Resx

语言:构建脚本

语言:SQL

此功能在 C# 中可用

此功能在 Visual Basic 中可用

功能在 C++ 中不可用

此功能在 ASP.NET 中不可用

此功能在 Razor 中不可用

此功能在 XAML 中不可用

此功能在资源文件中不可用

此功能在构建脚本文件中不可用

此功能在 SQL/NoSQL 文件和注入中不可用

此处提供的说明和示例针对在 C# 中使用该功能。 有关其他语言的更多信息,请参阅 语言和框架 部分中的相应主题。

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