2016-06-24 33 views
0

Equals和==檢查引用是否相等。 但它的行爲不同,爲什麼? 這裏Equals 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

是的,有 - 但只適用於明確聲明的字符串文字,因此需要在運行時創建的任何字符串的值相等。我只是沒有真正遵循答案中的邏輯。 –

相關問題