Visual Studio で Equals および GetHashCode メソッドのオーバーライドを生成する

このコード生成は以下に適用されます。

  • C#

概要:Equals メソッドと GetHashCode メソッドを生成します。

タイミング: これらのオーバーライドは、メモリ内のオブジェクトの場所ではなく、1 つ以上のフィールドによって比較される型がある場合に生成されます。

理由:

  • 値の型を実装する場合、Equals メソッドのオーバーライドを検討してください。 オーバーライドにした場合、ValueType では、Equals メソッドの既定の実装に比べ、パフォーマンスが上がります。

  • 参照型を実装する場合、Equals メソッドのオーバーライドは、型がポイント、文字列、BigNumber などの基本データ型に似ている場合に検討してください。

  • ハッシュ テーブルで型を正しく機能させるには、GetHashCode メソッドをオーバーライドします。 詳細については等値演算子のガイドラインをご覧ください。

方法

  1. 型宣言の行のどこかにカーソルを置きます。

    public class ImaginaryNumber
    {
        public double RealNumber { get; set; }
        public double ImaginaryUnit { get; set; }
    }
    

    コードは次のスクリーンショットのようになります。

    Screenshot of highlighted code on which to apply the generated method

    ヒント

    型名をダブルクリックして選択しないでください。ダブルクリックすると、メニュー オプションが利用できなくなります。 行のどこかにカーソルを置くだけです。

  2. 次に、次の操作のいずれかを選択します。

    • Ctrl+. キーを押して、[クイック アクションとリファクタリング] メニューをトリガーします。

    • 右クリックして [クイック アクションとリファクタリング] メニューを選択します。

    • 左余白に表示される Screenshot of the Quick Actions screwdriver icon in Visual Studio アイコンをクリックします。

  3. ドロップダウン メニューで [Equals(object) を生成する] または [Equals および GetHashCode を生成する] を選択します。

    Screenshot of the Generate Overrides drop-down menu

  4. [メンバーの選択] ダイアログ ボックスで、メソッドを生成するメンバーを選択します。

    Generate overrides dialog

    ヒント

    ダイアログの下部の近くにあるチェックボックスを使って、このダイアログから演算子を生成することもできます。

    Equals メソッドと GetHashCode メソッドは、次のコードに示されているように、既定の実装で生成されます。

    public class ImaginaryNumber : IEquatable<ImaginaryNumber>
    {
        public double RealNumber { get; set; }
        public double ImaginaryUnit { get; set; }
    
        public override bool Equals(object obj)
        {
            return Equals(obj as ImaginaryNumber);
        }
    
        public bool Equals(ImaginaryNumber other)
        {
            return other != null &&
                   RealNumber == other.RealNumber &&
                   ImaginaryUnit == other.ImaginaryUnit;
        }
    
        public override int GetHashCode()
        {
            return HashCode.Combine(RealNumber, ImaginaryUnit);
        }
    }
    

    コードは次のスクリーンショットのようになります。

    Screenshot of the result of the generated method

関連項目