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

标签 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 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。看起来您使用了“等于”生成的 Roslyn 实现。

如果您调用 Alt+Ins 并选择“Equality members”,ReSharper 2017.x 仍会生成预期的代码。

enter image description here

但是,如果您按 Alt+Enter 调用 Alt+Enter 菜单,而不是在方法或 ReSharper 曲线上,此菜单将显示 Roslyn 建议(VS 图标在一个灯泡图标)

enter image description here

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

我可能会取消勾选 ReSharper |选项 |代码检查 |设置 | Visual Studio 集成 |不显示 Visual Studio 灯泡 复选框不将 Roslyn 建议合并到 ReSharper 菜单

关于c# - 新的 ReSharper Equals() 和 GetHashCode() 代码生成方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46347470/

相关文章:

c# - 使用 protobuf.net 反序列化缺失类型

c# - .NET Core 中的 System.Attribute.GetCustomAttribute

cryptography - 并行计算大文件的哈希码

optimization - 最适合动态语言字段访问的数据结构

c# - ReSharper 有没有一种方法可以抑制一个文件中的所有错误/警告?

Resharper - 折叠所有文档中的空标签

c# - Task.Factory.StartNew() Taskscheduler 参数

database - 哈希与数据库查找效率

c# - NullReferenceException 与 resharper 建议的对象初始值设定项

c# - IdentityServer登录后不包含AdditionalClaims