Equals 和 == 都是用於比較。
如果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));
輸出結果:
True
True
False
True
值類型是存儲在內存中的堆棧(以后簡稱棧),而引用類型的變量在棧中僅僅是存儲引用類型變量的地址,而其本身則存儲在堆中。
"==" : 操作比較的是兩個變量的值是否相等,對於引用型變量表示的是兩個變量在堆中存儲的地址是否相同,即棧中的內容是否相同。
"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
"==" : 操作比較的是兩個變量的值是否相等,對於引用型變量表示的是兩個變量在堆中存儲的地址是否相同,即棧中的內容是否相同。
"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