2016-06-24 5 views
0

等しいと==は参照平等をチェックします。 しかし、それはなぜ異なった動作をしますか?ここで 等しいvs ==は異なる動作をします

Console.WriteLine(c == d); //False 
Console.WriteLine(c.Equals(d)); //True 

Console.WriteLine(cc == dd); //True 
Console.WriteLine(cc.Equals(dd));//True 

誰かがシーンの背後に何が起こるかを説明することができます。など

//https://blogs.msdn.microsoft.com/csharpfaq/2004/03/29/when-should-i-use-and-when-should-i-use-equals/ 
public void StringDoubleEqualsVsEquals() 
{ 
    // Create two equal but distinct strings 
    string a = new string(new char[] { 'h', 'e', 'l', 'l', 'o' }); 
    string b = new string(new char[] { 'h', 'e', 'l', 'l', 'o' }); 

    Console.WriteLine(a == b); //True 
    Console.WriteLine(a.Equals(b)); //True 

    // Now let's see what happens with the same tests but with variables of type object 
    object c = a; 
    object d = b; 

    Console.WriteLine(c == d); //False 
    Console.WriteLine(c.Equals(d)); //True 

    /*************************************************************************/ 
    Console.WriteLine(Environment.NewLine); 
    string aa = "1"; 
    string bb = "1"; 

    Console.WriteLine(aa == bb);//True 
    Console.WriteLine(aa.Equals(bb));//True 

    object cc = aa; 
    object dd = bb; 

    Console.WriteLine(cc.GetType());//System.String 
    Console.WriteLine(dd.GetType());//System.String 

    Console.WriteLine(cc == dd);//True 
    Console.WriteLine(cc.Equals(dd));//True 

    Console.ReadKey(); 
} 
+0

文字列 '=='演算子が値を参照していないかどうかをチェックします。https://msdn.microsoft.com/en-us/library/362314fe.aspx –

+0

'Equals'と' == 'はどちらも参照用にテストされていません平等。 – Lee

+0

文字列の場合は '' == 'は値の比較を行い、参照の比較は行いません。](https://msdn.microsoft.com/en-us/library/system.string.op_equality(v = vs.110).aspx ) –

答えて

0

オペレータ==Object.Equalsはindepentently実現可能なものです。通常、Object.Equalsは値の等しいかどうかをチェックするために実装され、==は参照の等価性をチェックします。しかし、実際にはstringのオペレータ==も値の等しいかどうかをチェックします。

+0

私は '=='の 'string'オーバーロードが 'string pooling'のため*の値の等価性をチェックしていると思われる理由に従いません。確かに、あなたが示唆しているように*すべての文字列がプールされ/インターンされていれば、これは決して必要ではありませんか? –

+0

内部文字列プーリングが存在しないのですか?私はそこに存在すると信じていました。それゆえ、文字列については、参照平等と価値平等が一致しています。 – Codor

+1

はい、明示的に宣言された文字列リテラルのみのため、実行時に作成される文字列の値の等価性が必要です。私はちょうど答えの論理に従っていませんでした。 –

関連する問題