私は、しばらくの間、コード生成を可能にする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)も、比較されるプロパティの数に応じて変化するようです。
誰でも説明がありますか?
ReSharperのはhttps://stackoverflow.com/questions/32808566/why-doesを参照してくださいロスリンで使用されるアルゴリズムへの説明については、この質問に答え初期化のために生成されたgethashcode-in-initial-hash-value-in-anonymous –