ReSharper を使用して等価メンバーを生成します。必要に応じて、必要に応じて演算子を実装IEquatable<T>
したり、オーバーライドしたりします(もちろん、これは決して行いませんが、とにかくクールです)。
Equals の実装には、 のオーバーライドとObject.Equals(Object)
、厳密に型指定されたバリアント (不要な型チェックを回避できます) が含まれます。型の少ないバージョンは、型チェックを実行した後、強く型付けされたバージョンを呼び出します。厳密に型指定されたバージョンは、参照の等価性チェック ( Object.ReferenceEquals(Object,Object)
) を実行してから、すべてのフィールドの値を比較します (つまり、ジェネレーターに含めるように指示したフィールドのみ)。
に関してGetHashCode
は、フィールドのGetHashCode
値のスマート因数分解が結合されます (unchecked
コンパイラのオプションを使用する場合、オーバーフロー例外を回避するために使用しchecked
ます)。フィールドの各値 (最初の値を除く) は、結合される前に素数で乗算されます。null にならないフィールドを指定することもでき、null チェックはすべて破棄されます。
を押してから「 Generate Equality Members」を選択すると、Polygon
クラスに次のように表示されます。ALT+Insert
public class Polygon : IEquatable<Polygon>
{
public Point[] Vertices { get; set; }
public bool Equals(Polygon other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return Equals(other.Vertices, Vertices);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != typeof (Polygon)) return false;
return Equals((Polygon) obj);
}
public override int GetHashCode()
{
return (Vertices != null ? Vertices.GetHashCode() : 0);
}
}
上記で説明した機能の一部は、フィールドが 1 つしかないため適用されません。配列の内容をチェックしていないことにも注意してください。
ただし、一般的に、ReSharper はほんの数秒で多くの優れたコードを生成します。そして、その機能は、ReSharper をこれほど素晴らしいツールにしている私のリストのかなり下の方にあります。