2017-09-21 11 views
0

私は、しばらくの間、コード生成を可能にするReSharper機能を使用しました。私がいつもやったことは、クラスのAlt-Enter(任意のメソッドの外で)を押すこと、またはAlt-Insを押して等価メンバーを選択し、すべてのメンバーを選択して[OK]をクリックすることです。新しいReSharper Equals()とGetHashCode()コード生成メソッド

ことをやったときに生成されていたコードは次のようなものだった:(?多分ReSharperの2017のか、マイナーバージョンのリリースと)にもかかわらず最近

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; 
     } 
     } 
    } 

、Altキーは、Enterキーを押すと、別のものをもたらしますAlt-Insertキーはまだそれが以前より同じコードを生成押し、

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; 
     } 
    } 

変なふう:メニューは、と等しく、代わりにこの種のコードを生成しますGetHashCodeメソッド項目を生成します。 ReSharperは、生成方法に応じて2つの異なるテンプレートを生成するようです。違いはかなり異なるように見えますが、異なる素数が使用され、未チェックのキーワードが失われています。

私は最初のバージョンで素数397を使用する理由をよく知っていましたが、ReSharperのオンラインヘルプでさえ、その2番目のバージョンについて何も説明が見つかりません。フィード整数(この例では997021164)も、比較されるプロパティの数に応じて変化するようです。

誰でも説明がありますか?

+0

ReSharperのはhttps://stackoverflow.com/questions/32808566/why-doesを参照してくださいロスリンで使用されるアルゴリズムへの説明については、この質問に答え初期化のために生成されたgethashcode-in-initial-hash-value-in-anonymous –

答えて

2

ReSharperはGetHashCode生成で397という数字を使用しています。 "Equals"世代のRoslyn実装を使用したようです。

あなたはAltキー+インを呼び出し、 "平等のメンバー" を選択した場合は、ReSharperの2017.xはまだ期待されるコードを生成します。

enter image description here

しかし、あなたはAltキーをヒットした場合 + がない方法またはReSharperの波線で、メニューを表示します+ Altキーを呼び出すためにを入力し、このメニューは電球のアイコン上のアイコンVS(ロザリン提案が表示されます)

enter image description here

このようなクイックフィックスは、ロザリン実装を生成します。

私はReSharperのメニューにロザリン提案をマージしないReSharper | Options | Code Inspection | Settings | Visual Studio Integration | Do not show Visual Studio bulbチェックボックスを外します可能性が

関連する問題