ホームページ > バックエンド開発 > C++ > 「等しい」をオーバーライドするときに、なぜ「gethashcode」をオーバーライドする必要があるのですか?

「等しい」をオーバーライドするときに、なぜ「gethashcode」をオーバーライドする必要があるのですか?

Linda Hamilton
リリース: 2025-02-02 15:16:10
オリジナル
344 人が閲覧しました

Why Must You Override `GetHashCode` When Overriding `Equals`?

一貫したオブジェクトの比較

については、GetHashCode Equalsおよび

をオーバーライドします

Equalsメソッドをオーバーライドすることにより、クラスのオブジェクトがどのように平等に対して比較されるかを再定義する場合、GetHashCodeメソッドもオーバーライドすることが不可欠です。これは、オブジェクトが辞書やハッシュセットなどのハッシュベースのコレクションのキーとして使用される場合に特に重要です。

クラスを考えてみてください

Foo

<code class="language-csharp">public override bool Equals(object obj)
{
    // ... comparison logic based on FooId ...
}</code>
ログイン後にコピー

プロパティに基づいてEqualsオブジェクトを比較するようにカスタマイズした場合、デフォルトFooFooIdから継承された)は、オブジェクトのメモリアドレスに基づいてハッシュコードを生成します。 この矛盾は、ハッシュテーブルのキーとしてGetHashCodeオブジェクトを使用する場合、予測不可能な動作につながります。 ObjectFooなぜ一貫したハッシュ事項

オーバーライド

に不可欠です

GetHashCode

一貫したハッシュ:
    オブジェクトのハッシュコードは、ハッシュテーブル内の位置を決定します。 等しいオブジェクト
  • 必須同じハッシュコードがあり、それらが一貫して同じバケツに配置されていることを確認します。 ハッシュ衝突の回避:2つのオブジェクトに同じハッシュコード(衝突)がある場合、ハッシュベースのコレクションは、
  • を呼び出すことなく同一であると誤って検証します。 よく実現された
  • 衝突を最小限に抑え、真の平等を決定するためにを使用してください。 EqualsGetHashCode効果的にEquals
  • を実装します

の実装は、メソッドのロジックと一致する必要があります。 GetHashCode 等しいオブジェクトには、同一のハッシュコードが必要です。

同一のハッシュコードは平等を保証するものではありませんが、決定的な比較のためにGetHashCodeメソッドをトリガーします。 Equals

    クラスの場合、適切な
  • オーバーライドは
  • です
  • Equalsこれにより、
  • に基づいてハッシュコードが生成され、平等チェックイン

FooGetHashCodeカスタム比較を使用して、強化された透明度

<code class="language-csharp">public override int GetHashCode()
{
    return this.FooId.GetHashCode();
}</code>
ログイン後にコピー

FooIdおよびEqualsをオーバーライドする場合は、コードの読みやすさと保守性を向上させるために、カスタム平等演算子(

および

)を追加することを検討してください。

以上が「等しい」をオーバーライドするときに、なぜ「gethashcode」をオーバーライドする必要があるのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート