生成相等成员
在 Object 类中,相等方法(即 Equals() 和 GetHashCode() )以及相等运算符(即 == 和 != )的实现保证了引用相等。 在您创建的类型中(最终派生自 对象 ,因此默认实现了引用相等),您可能希望为该类型的对象实现值相等,并使用哈希码作为哈希用途的唯一对象标识符。 在这种情况下,您需要为您的类型重写相等方法和运算符。
JetBrains Rider 允许您通过 生成相等成员 命令自动化这些例程。
在下面的示例中,此命令用于基于 _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 或从主菜单中选择 。 或者,您可以按 Ctrl+Shift+A ,在弹出窗口中开始输入命令名称,然后在那里选择它。
在 生成 弹出窗口中,选择 相等成员。
在出现的 生成 对话框中,选择要在
Equals()方法中比较并在GetHashCode()方法中包含在值生成中的字段。
如果您的类型中没有字段/属性,或者您未选择任何字段/属性,JetBrains Rider 将根据您的设置抛出新的
NotImplementedException(),返回默认值,或在生成的方法体中放置无法编译的代码。可选地,在对话框中使用以下控件:
字段可以为 null — 如果您的类型中有任何可为空的字段或属性,则会显示。 默认情况下,此复选框是选中的,这意味着 JetBrains Rider 将为选定的字段生成空值检查。 如果您不需要空值检查,可以取消选中此复选框。
字符串比较 — 如果您的类型中有任何字符串字段,则会显示。 JetBrains Rider 将为选定的字符串生成
string.Compare(string, string, StringComparison),并且选择器允许您选择应为 StringComparison 参数生成的值。GetHashCode 已存在 和 Equals 已存在 会在相应的重写已存在时出现,并允许您选择:
如果方法已存在,则替换该方法。
将新生成的方法与现有方法并排放置。
完全跳过生成新方法。
使用 'System.HashCode' 实现 'GetHashcode' — 如果选中此复选框,JetBrains Rider 将在生成的
GetHashcode实现中使用 System.HashCode (使用 xxHash32 )中的合并。 否则,JetBrains Rider 将生成其自己的自定义实现。重载相等运算符 — 为当前类型生成自定义相等和不相等运算符(即
>==和!=)。实现 IEquatable<T> 接口 实现了特定于类型的
Equals()方法。比较类型检查 — 允许您选择
Equals()方法将如何比较对象类型:类型与此完全相同
类型与所有者类型完全相同
类型为所有者类型或其子类型
点击 确定 以完成向导。
您还可以通过在 生成 菜单中选择 Overriding Members来生成这两个重写,但在这种情况下,它们都将返回基类方法。
作为在您的类型中生成相等成员的替代方法,您可以为您的类型 生成相等比较器类。