新的 ReSharper Equals() 和 GetHashCode() 代码生成方法
New ReSharper Equals() and GetHashCode() code generation method
我使用允许代码生成的 ReSharper 功能已有一段时间了。我一直这样做的方法是在我的 class 中按 Alt-Enter(在任何方法之外),或按 Alt-Ins,然后选择 Equality members,然后选择所有成员并单击确定。
这样做时生成的代码是这样的:
public class Foo
{
public int Bar { get; }
public int Baz { get; }
protected bool Equals(Foo other)
{
return Bar == other.Bar
&& Baz == other.Baz;
}
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((Foo) obj);
}
public override int GetHashCode()
{
unchecked
{
return (Bar * 397) ^ Baz;
}
}
}
不过最近(可能随着 ReSharper 2017 或次要版本的发布?),按 Alt-Enter 会带来另一个菜单,其中包含 Generate Equals and GetHashCode 项,而是生成这种代码:
public class Foo
{
public int Bar { get; }
public int Baz { get; }
public override bool Equals(object obj)
{
var foo = obj as Foo;
return foo != null &&
Bar == foo.Bar &&
Baz == foo.Baz;
}
public override int GetHashCode()
{
var hashCode = 997021164;
hashCode = hashCode * -1521134295 + Bar.GetHashCode();
hashCode = hashCode * -1521134295 + Baz.GetHashCode();
return hashCode;
}
}
奇怪的是,按 Alt-Insert 仍然生成与之前相同的代码。现在 ReSharper 似乎根据我们生成它的方式生成了两个不同的模板。差异似乎非常显着,使用了不同的质数,并且丢失了未检查的关键字。
我很熟悉第一个版本中使用质数 397 的原因,但我找不到第二个版本的任何解释,甚至在 ReSharper 在线帮助中也找不到。提要整数(本例中为 997021164)似乎也会根据要比较的属性数量而变化。
有人对此有解释吗?
ReSharper 在 GetHashCode 生成中仍然使用数字 397。看起来您使用了 "Equals" 代的 Roslyn 实现。
如果您调用 Alt+Ins 和 select "Equality members",ReSharper 2017.x 将仍然生成预期的代码。
但是,如果您按 Alt+Enter 来调用 Alt+Enter 菜单,而不是在方法或 ReSharper 曲线上,则此菜单将显示 Roslyn 建议(灯泡图标上的 VS 图标)
此类快速修复将生成 Roslyn 实现。
我可能会取消选中 ReSharper | Options | Code Inspection | Settings | Visual Studio Integration | Do not show Visual Studio bulb
复选框以不将 Roslyn 建议合并到 ReSharper 菜单
我使用允许代码生成的 ReSharper 功能已有一段时间了。我一直这样做的方法是在我的 class 中按 Alt-Enter(在任何方法之外),或按 Alt-Ins,然后选择 Equality members,然后选择所有成员并单击确定。
这样做时生成的代码是这样的:
public class Foo
{
public int Bar { get; }
public int Baz { get; }
protected bool Equals(Foo other)
{
return Bar == other.Bar
&& Baz == other.Baz;
}
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((Foo) obj);
}
public override int GetHashCode()
{
unchecked
{
return (Bar * 397) ^ Baz;
}
}
}
不过最近(可能随着 ReSharper 2017 或次要版本的发布?),按 Alt-Enter 会带来另一个菜单,其中包含 Generate Equals and GetHashCode 项,而是生成这种代码:
public class Foo
{
public int Bar { get; }
public int Baz { get; }
public override bool Equals(object obj)
{
var foo = obj as Foo;
return foo != null &&
Bar == foo.Bar &&
Baz == foo.Baz;
}
public override int GetHashCode()
{
var hashCode = 997021164;
hashCode = hashCode * -1521134295 + Bar.GetHashCode();
hashCode = hashCode * -1521134295 + Baz.GetHashCode();
return hashCode;
}
}
奇怪的是,按 Alt-Insert 仍然生成与之前相同的代码。现在 ReSharper 似乎根据我们生成它的方式生成了两个不同的模板。差异似乎非常显着,使用了不同的质数,并且丢失了未检查的关键字。
我很熟悉第一个版本中使用质数 397 的原因,但我找不到第二个版本的任何解释,甚至在 ReSharper 在线帮助中也找不到。提要整数(本例中为 997021164)似乎也会根据要比较的属性数量而变化。
有人对此有解释吗?
ReSharper 在 GetHashCode 生成中仍然使用数字 397。看起来您使用了 "Equals" 代的 Roslyn 实现。
如果您调用 Alt+Ins 和 select "Equality members",ReSharper 2017.x 将仍然生成预期的代码。
但是,如果您按 Alt+Enter 来调用 Alt+Enter 菜单,而不是在方法或 ReSharper 曲线上,则此菜单将显示 Roslyn 建议(灯泡图标上的 VS 图标)
此类快速修复将生成 Roslyn 实现。
我可能会取消选中 ReSharper | Options | Code Inspection | Settings | Visual Studio Integration | Do not show Visual Studio bulb
复选框以不将 Roslyn 建议合并到 ReSharper 菜单