C# 新的ReSharper Equals()和GetHashCode()代码生成方法
我已经使用了允许代码生成的ReSharper特性一段时间了。我一直都是这样做的:在我的类中按Alt Enter键(在任何方法之外),或者按Alt-Ins键,选择Equality成员,然后选择all成员并单击ok 执行此操作时生成的代码如下所示:C# 新的ReSharper Equals()和GetHashCode()代码生成方法,c#,hash,resharper,gethashcode,resharper-2017,C#,Hash,Resharper,Gethashcode,Resharper 2017,我已经使用了允许代码生成的ReSharper特性一段时间了。我一直都是这样做的:在我的类中按Alt Enter键(在任何方法之外),或者按Alt-Ins键,选择Equality成员,然后选择all成员并单击ok 执行此操作时生成的代码如下所示: public class Foo { public int Bar { get; } public int Baz { get; } protected bool Equals(Foo other)
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和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在线帮助中也找不到。feed整数(本例中为997021164)似乎也会根据要比较的属性的数量而变化
有人对此有解释吗?ReSharper在生成GetHashCode时仍然使用数字397。看起来您使用了Roslyn实现的“Equals”生成 如果调用Alt+Ins并选择“Equality members”,ReSharper 2017.x仍将生成预期代码 但是,如果按Alt+Enter键调用Alt+Enter菜单,而不是在方法或ReSharper squiggle上,此菜单将显示Roslyn建议(与灯泡图标上的图标相比) 这种快速修复将生成Roslyn实现
我可能会取消选中
ReSharper |选项|代码检查|设置| Visual Studio集成|不显示Visual Studio灯泡
复选框,不将Roslyn建议合并到ReSharper菜单ReSharper在生成GetHashCode时仍然使用数字397。看起来您使用了Roslyn实现的“Equals”生成
如果调用Alt+Ins并选择“Equality members”,ReSharper 2017.x仍将生成预期代码
但是,如果按Alt+Enter键调用Alt+Enter菜单,而不是在方法或ReSharper squiggle上,此菜单将显示Roslyn建议(与灯泡图标上的图标相比)
这种快速修复将生成Roslyn实现
我可能会取消勾选
ReSharper |选项|代码检查|设置| Visual Studio集成|不显示Visual Studio灯泡
复选框不将Roslyn建议合并到ReSharper菜单ReSharper回答了这个问题,关于Roslyn使用的算法的解释请参见ReSharper回答了这个问题,关于Roslyn使用的算法的说明,请参见