C# 新的ReSharper Equals()和GetHashCode()代码生成方法

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)

我已经使用了允许代码生成的ReSharper特性一段时间了。我一直都是这样做的:在我的类中按Alt Enter键(在任何方法之外),或者按Alt-Ins键,选择Equality成员,然后选择all成员并单击ok

执行此操作时生成的代码如下所示:

   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使用的算法的说明,请参见