8

私はオーバーライドを持ってGetHashCodeおりEquals、両方のメソッドは異なるオブジェクトに対して同じ結果を提供しますが、なぜそれでもfalseになるのですか?

class Program
{
    static void Main(string[] args)
    {    
        Console.WriteLine(new Person("james") == new Person("james"));    
        Console.ReadKey();
    }    
}

class Person
{
    private string Name;

    public Person(string name)
    {
        Name = name;
    }
    public override int GetHashCode()
    {
        return 1;
    }
    public override bool Equals(object obj)
    {
        return true;
    }
}
4

5 に答える 5

26

==演算子はデフォルトで等式を参照するためです。Equalsメソッドを呼び出しません。

==必要に応じて、演算子をオーバーライドできます。参照:Equals()およびOperator==をオーバーライドするためのガイドライン

C#には、参照の平等(IDとも呼ばれます)と値の平等の2種類の平等があります。値の平等は、一般的に理解されている平等の意味です。つまり、2つのオブジェクトに同じ値が含まれていることを意味します。たとえば、値が2の2つの整数は、値が等しくなります。参照の同等性とは、比較するオブジェクトが2つないことを意味します。代わりに、2つのオブジェクト参照があり、両方とも同じオブジェクトを参照しています。

[...]

デフォルトでは、演算子==は、2つの参照が同じオブジェクトを示しているかどうかを判断することにより、参照の同等性をテストします。したがって、この機能を取得するために、参照型は演算子==を実装する必要はありません。型が不変である場合、つまりインスタンスに含まれるデータを変更できない場合、演算子==をオーバーロードして、参照の同等性の代わりに値の同等性を比較すると、不変のオブジェクトとして、それらは長い間同じと見なすことができるため、便利です。それらは同じ値を持っているので。不変でない型で演算子==をオーバーライドすることはお勧めできません。

于 2010-08-03T11:10:31.353 に答える
5

==それが本当に必要な場合は、演算子を個別にオーバーライドする必要があります。

http://msdn.microsoft.com/en-us/library/ms173147%28VS.80%29.aspx

于 2010-08-03T11:11:50.917 に答える
2

==この場合、は参照等式演算子です。2つの参照が同一であるかどうかを比較します。

new演算子は常に新しいオブジェクトを作成するため、anew Something()のオブジェクトへの同一の参照になることはありませんnew Something()

演算子をオーバーライドして==、参照比較の代わりに値比較を実行できます。これは、egStringが行うことです。

も参照してください

関連する質問

于 2010-08-03T11:12:22.010 に答える
2

はいdtbはあなたが望む正しいです

bool b = new Person("james").Equals(new Person("james")); 

代わりは

于 2010-08-03T11:12:23.570 に答える
2

オペレーターは、==2つの変数が実際に、文字通りメモリ内の同じオブジェクトを参照しているかどうかを確認します。あなたの例では、2つのJamesを作成します。彼らは双子である可能性があります(つまり、同じメモリフットプリントを持っている可能性があります)が、同じ人物ではありません(つまり、2つの異なるメモリ位置を持っています)。あなたが書いた場合:

Person a = new Person("james");
Person b = a;
Console.WriteLine(a == b); 

trueaとbは同じJamesの2つの名前にすぎないため、次のようになります。

于 2010-08-03T11:24:37.507 に答える