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

时间:2017-09-21 15:10:16

标签: c# hash resharper gethashcode resharper-2017

我使用了ReSharper功能,允许代码生成一段时间。我一直这样做的方法是在我的班级中按Alt-Enter(在任何方法之外),或按Alt-Ins,然后选择 Equality members ,然后选择所有成员并单击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)似乎也会根据要比较的属性数量而变化。

有没有人对此有解释?

1 个答案:

答案 0 :(得分:4)

ReSharper仍在GetHashCode生成中使用数字397。看起来你使用了Roslyn实现" Equals"代。

如果您拨打 Alt + Ins 并选择" Equality members",ReSharper 2017.x仍会生成预期的代码。

enter image description here

但是,如果按 Alt + Enter 调用Alt + Enter菜单,而不是方法或ReSharper波形,此菜单将显示Roslyn建议(VS图标开启一个灯泡图标)

enter image description here

这样的快速修复将生成Roslyn实现。

我可能会取消选中ReSharper | Options | Code Inspection | Settings | Visual Studio Integration | Do not show Visual Studio bulb复选框,以便不将Roslyn建议合并到ReSharper菜单