等価メンバーを生成する
オブジェクトクラスでの等式メソッド(つまり Equals() および GetHashCode() )および等式演算子(つまり == および != )の実装により、参照の等式が保証されます。 作成するタイプ(最終的に Object から派生するため、デフォルトで参照の等価性を実装します)では、このタイプのオブジェクトの値の等価性を実装し、ハッシュコードをハッシュ目的の一意のオブジェクト識別子として使用することができます。 この場合、タイプの等式メソッドと演算子をオーバーライドする必要があります。
JetBrains Rider では、 等価メンバーを生成する コマンドを使用してこれらのルーチンを自動化できます。
以下の例では、このコマンドを使用して、 _radius、 _center、 _description フィールドに基づいて Equals() および GetHashCode() メソッドを生成します。
生成前 | 生成後 |
|---|---|
class Circle
{
/// <summary>Radius of the circle</summary>
int _radius;
/// <summary>Center point of the circle</summary>
Point _center;
/// <summary>Description of the circle</summary>
string _description;
}
|
class Circle
{
protected bool Equals(Circle other)
{
return _radius == other._radius
&& _center.Equals(other._center)
&& _description == other._description;
}
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((Circle) obj);
}
public override int GetHashCode()
{
return HashCode.Combine(_radius, _center, _description);
}
/// <summary>Radius of the circle</summary>
int _radius;
/// <summary>Center point of the circle</summary>
Point _center;
/// <summary>Description of the circle</summary>
string _description;
}
|
等価メンバーのオーバーライドを生成する
エディターで、型名または型内の等価メンバーのオーバーライドを挿入する行にキャレットを置きます。 キャレットが型名上にある場合、生成されたコードは型宣言の先頭に追加されます。
Alt+Insert を押すか、メインメニューから を選択してください。 あるいは、 Ctrl+Shift+A を押して、ポップアップでコマンド名を入力して、そこで選択することもできます。
生成する ポップアップで、 等価メンバー を選択します。
表示される 生成する ダイアログで、
Equals()メソッドで比較し、GetHashCode()メソッドでの値の生成に含めるフィールドを選択します。
型にフィールドまたはプロパティが存在しない場合、またはいずれも選択しない場合、JetBrains Rider は設定に応じて新しい
NotImplementedException()をスローする、デフォルト値を返す、または生成されたメソッドの本体にコンパイルできないコードを配置します。必要に応じて、ダイアログで次のコントロールを使用します。
フィールドは null 可能 — 自分の型に nullable フィールドやプロパティがある場合に表示されます。 デフォルトでこのチェックボックスが選択されており、JetBrains Rider は選択されたフィールドに対して null チェックを生成します。 null チェックが不要な場合は、このチェックボックスをオフにできます。
文字列比較 — 型に文字列フィールドがある場合に表示されます。 JetBrains Rider は選択した文字列に対して
string.Compare(string, string, StringComparison)を生成し、セレクターで StringComparison 引数に生成する値を選択できます。対応する上書きがすでに存在する場合は GetHashCode はすでに存在する と Equals はすでに存在する が表示され、次のいずれかを選択できるようになります。
メソッドがすでに存在する場合は置換します。
新しく生成されたメソッドを既存のメソッドと並べて置きます。
新しいメソッドの生成をすべてスキップします。
「System.HashCode」を使用して「GetHashcode」を実装する — このチェックボックスを選択すると、JetBrains Rider は生成される
GetHashcode実装で System.HashCode (xxHash32 を使用)のCombineを使用します。 それ以外の場合、JetBrains Rider は独自のカスタム実装を生成します。等価演算子をオーバーロードする — 現在のタイプのカスタムの等式および不等式演算子(つまり、
>==および!=)を生成します。IEquatable<T> インターフェースを実装する は型固有の
Equals()メソッドを実装しています。型チェックの比較 —
Equals()メソッドがオブジェクトの型を比較する方法を選択できます。これとまったく同じタイプ
所有者の種類として正確に入力してください
タイプは所有者タイプまたはサブタイプのものです
OK をクリックしてウィザードを完了します。
生成する メニューで メンバーを無効にするを選択して 2 つのオーバーライドを生成することもできますが、その場合は両方とも基本メソッドを返します。
タイプ内の等価メンバーを生成する代わりに、タイプの 等価比較クラスを生成できます。