生成相等成员
在 Object 类 中,相等方法(即 Equals() 和 GetHashCode() )以及相等运算符(即 == 和 != )的实现保证了引用相等。 在您创建的类型中(最终派生自 Object ,因此默认实现了引用相等),您可能希望为该类型的对象实现值相等,并使用哈希码作为哈希用途的唯一对象标识符。 在这种情况下,您需要为您的类型重写相等方法和运算符。
ReSharper 允许您通过 生成相等成员 命令自动化这些例程。
在下面的示例中,此命令用于基于 _radius、 _center 和 _description 字段生成 Equals() 和 GetHashCode() 方法。
生成前 | 生成后 |
|---|---|
class Circle
{
/// <summary>Radius of the circle</summary>
int _radius;
/// <summary>Center point of the circle</summary>
Point _center;
/// <summary>Description of the circle</summary>
string _description;
}
|
class Circle
{
protected bool Equals(Circle other)
{
return _radius == other._radius
&& _center.Equals(other._center)
&& _description == other._description;
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((Circle) obj);
}
public override int GetHashCode()
{
return HashCode.Combine(_radius, _center, _description);
}
/// <summary>Radius of the circle</summary>
int _radius;
/// <summary>Center point of the circle</summary>
Point _center;
/// <summary>Description of the circle</summary>
string _description;
}
|
为相等成员生成重写
在编辑器中,将插入符号放置在类型名称处或类型内您希望插入相等成员重写的行上。 如果插入符号位于类型名称上,生成的代码将添加到类型声明的开头。
按 Alt+Insert 或从主菜单中选择 。 或者,您可以按 Control+Shift+A ,在弹出窗口中开始输入命令名称,然后在那里选择它。
在 生成 弹出窗口中,选择 相等成员。
在出现的 生成 对话框中,选择要在
Equals()方法中比较的字段,并选择要在GetHashCode()方法中包含的值生成字段。
如果您的类型中没有字段/属性,或者您未选择任何字段/属性,根据设置,ReSharper 将抛出新的
NotImplementedException(),返回默认值,或在生成的方法体中放置无法编译的代码。 您可以在 ReSharper 选项的 页面上配置设置。可选地,在对话框中使用以下控件:
字段可以为 null — 如果您的类型中有任何可为空的字段或属性,则会显示。 默认情况下,此复选框是选中的,这意味着 ReSharper 将为选定的字段生成空值检查。 如果您不需要空值检查,可以取消选中此复选框。
字符串比较 — 如果您的类型中有任何字符串字段,将会出现。 ReSharper 将为选定的字符串生成
string.Compare(string, string, StringComparison),并且选择器可让您选择为 StringComparison 参数生成的值。GetHashCode 已存在 和 Equals 已存在 如果相应的重写已存在,则会显示,并允许您选择是否:
替换已存在的方法。
将新生成的方法与现有方法并排放置。
完全跳过生成新方法。
使用 'System.HashCode' 实现 'GetHashcode' — 如果选中此复选框,ReSharper 将在生成的
获取哈希代码实现中使用 System.HashCode (使用 xxHash32 )中的合并。 否则,ReSharper 将生成其自己的自定义实现。重载相等运算符 — 为当前类型生成自定义相等和不相等运算符(即
>==和!=)。实现 IEquatable<T> 接口 实现了一个特定于类型的
Equals()方法。比较对象类型检查 — 允许您选择
Equals()方法如何比较对象类型:类型与此完全相同
类型与所有者类型完全相同
类型是所有者类型或其子类型
单击 完成 完成向导。
您还可以单击 选项 ,在 ReSharper 选项的 页面上查看或修改通用代码生成首选项。
您还可以通过在 生成 菜单中选择 Overriding Members 来生成这两个重写,但在这种情况下,它们都将返回基类方法。
作为在类型内生成相等成员的替代方法,您可以为您的类型 生成相等比较器类。
此功能在以下语言和技术中 受支持:
此处提供的说明和示例针对在 C# 中使用该功能。 有关其他语言的更多信息,请参阅 语言和框架 部分中的相应主题。