[解決済み] EqualsメソッドがオーバーライドされたときにGetHashCodeをオーバーライドすることが重要な理由は何ですか?
質問
次のようなクラスがあるとします。
public class Foo
{
public int FooId { get; set; }
public string FooName { get; set; }
public override bool Equals(object obj)
{
Foo fooItem = obj as Foo;
if (fooItem == null)
{
return false;
}
return fooItem.FooId == this.FooId;
}
public override int GetHashCode()
{
// Which is preferred?
return base.GetHashCode();
//return this.FooId.GetHashCode();
}
}
をオーバーライドしました。
Equals
メソッドは
Foo
の行を表します。
Foo
のテーブルを作成します。 をオーバーライドするには、どちらの方法が望ましいですか?
GetHashCode
?
をオーバーライドすることが重要なのはなぜですか?
GetHashCode
?
解決方法は?
そうです、あなたのアイテムが辞書のキーとして使用される場合は重要です。
HashSet<T>
などが使用されます。
IEqualityComparer<T>
) を使って、アイテムをバケットにグループ化します。もし2つのアイテムのハッシュコードが一致しない場合、それらは
決して
は同等と見なします (
イコール
は単に呼び出されないだけです)。
は、その
GetHashCode()
メソッドに反映させる必要があります。
Equals
のロジックで、ルールは以下の通りです。
-
2つのものが等しい場合 (
Equals(...) == true
) ならば、それらは なければならない は同じ値を返します。GetHashCode()
-
もし
GetHashCode()
が等しい場合、それは ない が同じである必要はなく、これは衝突でありEquals
が呼び出され、本当の等号かどうかが確認されます。
この場合、"のようになります。
return FooId;
は適切な
GetHashCode()
を実装しています。複数のプロパティをテストする場合、対角線上の衝突を減らすために、以下のようなコードを使用してそれらを組み合わせることが一般的です。
new Foo(3,5)
とは異なるハッシュコードを持っています。
new Foo(5,3)
):
最近のフレームワークでは
HashCode
型には、複数の値からハッシュコードを作成するためのメソッドがあります。古いフレームワークでは、そのまま行く必要があるので、次のようなものがあります。
unchecked // only needed if you're compiling with arithmetic checks enabled
{ // (the default compiler behaviour is *disabled*, so most folks won't need this)
int hash = 13;
hash = (hash * 7) + field1.GetHashCode();
hash = (hash * 7) + field2.GetHashCode();
...
return hash;
}
ああ - 利便性のために、あなたはまた、提供することを検討するかもしれません。
==
と
!=
演算子をオーバーライドする際に
Equals
と
GetHashCode
.
これを間違えるとどうなるかのデモは こちら .
関連
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み】C#はJavaのcharAt()と同等?)
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] Eclipseにプロジェクトをインポートした後に「Must Override a Superclass Method」エラーが発生する。
-
[解決済み] Distinct() with lambda?
-
[解決済み] JavaでequalsとhashCodeをオーバーライドする際に考慮すべき事項は?
-
[解決済み] JavaでequalsとhashCodeのメソッドをオーバーライドする必要があるのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】「未割り当てのローカル変数を使用」とはどういう意味ですか?
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み】WPFでXamlファイルにコメントを追加する方法は?
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み】Swashbuckle/Swagger + ASP.Net Core: "Failed to load API definition" (API定義の読み込みに失敗しました
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない