Equals 和 == 都是用於比較。spa
若是a和b都是值類型,則a.Equals(b) 和 a == b 結果相同,可是在引用類型是它們的行爲是不一樣的:對象
string a = new string(new char[] {'d', 'a', 'n', 'c', 'e'});
string b = new string(new char[] {'d', 'a', 'n', 'c', 'e'});
object c = a;
object d = b;
Console.WriteLine (a==b);
Console.WriteLine (a.Equals(b));
Console.WriteLine (c==d);
Console.WriteLine (c.Equals(d));blog
輸出結果:ip
值類型是存儲在內存中的堆棧(之後簡稱棧),而引用類型的變量在棧中僅僅是存儲引用類型變量的地址,而其自己則存儲在堆中。
"==" : 操做比較的是兩個變量的值是否相等,對於引用型變量表示的是兩個變量在堆中存儲的地址是否相同,即棧中的內容是否相同。
"equals" : 操做表示的兩個變量是不是對同一個對象的引用,即堆中的內容是否相同。
string是一種特殊的引用類型,使string對象用起來就像是值類型同樣,string類型的==操做其實是比較兩個字符串的值是否相同。
因此:
Console.WriteLine (a==b); // 比較兩個字符串的值 - 返回true
Console.WriteLine (a.Equals(b)); // 比較兩個字符串的值 - 返回true
Console.WriteLine (c==d); // 比較兩個對象的在堆中的地址是否相同 - 返回false
Console.WriteLine (c.Equals(d)); // 比較兩個對象的所指向的內容是否相同 - 返回true