2

重複の可能性:
C# で Equals メソッドがオーバーライドされている場合、GetHashCode をオーバーライドすることが重要なのはなぜですか?

Object クラスの GetHashCode メソッドは実装していません。そのため、多くの警告が表示されます。

Equals メソッドでハッシュ コードをチェックするだけで等価性をチェックする方法があるので、Equals と GetHashCode の両方を実装し、「Object.GetHashCode が実装されていません」という警告が表示されないようにします。

GetHashCode を実装せずに Equals を実装するとどうなりますか? myclass のインスタンスはアプリケーションで更新可能です。

public class MyClass{

private string x;
private string y;

public override bool Equals(object obj)
        {

            try
            {

                 return    Object.Equals(this.x, obj.x)
                        && Object.Equals(this.y, obj.y);

            }
            catch(Exception Ex)
            {
                log.Debug(Ex.StackTrace);
                throw; 
            }
        }

}
4

3 に答える 3

3

を実装するEqualsが実装しないGetHashCode場合、ハッシュを使用するデータ構造 ( 、 など) でクラスが使用されると、HashSet<T>正しくDictionary<K,V>動作しません。これらのデータ構造を明示的に使用しなくても、一部のコードで使用されている可能性がある (つまり、一部の Linq 操作で HashSet が使用されている) 可能性があるため、オーバーライドする方が安全GetHashCodeです。

于 2012-05-17T21:29:53.003 に答える
2

GetHashCodehas テーブルにオブジェクトを格納および取得するために使用されます。つまり、オブジェクトの等価性を判断する別の方法です。

一方の ( ) をオーバーライドEqualsし、もう一方の ( ) をオーバーライドしないGetHashCode場合、 を使用した場合GetHashCode(つまり、ハッシュ テーブルとして実装されたコレクションにオブジェクトをドロップする場合) とEquals().

このテーマに関するEric Lippert によるこの投稿をお読みください。

于 2012-05-17T21:29:39.850 に答える
1

を実装しないGetHashCodeと、辞書やハッシュ セットなどの構造でキーとして使用されたときに、クラスの動作が不安定になります。これらのタイプの構造を使用したい場合、それを回避する方法はありません。技術的には、それらから離れていればアプリケーションは機能しますが、それは悪い形であり、あなたのクラスを使用する他の人は失礼な驚きに直面するでしょう.

于 2012-05-17T21:30:16.937 に答える