Equals() 和運算符 ==
C# 中有兩種不同的相等:引用相等和值相等。值相等是大家普遍理解的意義上的相等:它意味着兩個對象包含相同的值。例如,兩個值爲 2 的整數具有值相等性。引用相等意味着要比較的不是兩個對象,而是兩個對象引用,且兩者引用的是同一個對象。這可以通過簡單的賦值來實現,如下面的示例所示:
System.Object a = new System.Object();
System.Object b = a;
System.Object.ReferenceEquals(a, b); //returns true
在上面的代碼中,只存在一個對象,但存在對該對象的多個引用:a 和 b。由於它們引用的是同一個對象,因此具有引用相等性。如果兩個對象具有引用相等性,則它們也具有值相等性,但是值相等性不能保證引用相等性。
若要檢查引用相等性,應使用 ReferenceEquals。若要檢查值相等性,請使用 Equals。
運算符 ==
對於預定義的值類型,如果操作數的值相等,則相等運算符 (==) 返回 true,否則返回false。對於string以外的引用類型,如果兩個操作數引用同一個對象,則==返回true。對於string類型,==比較字符串的值
對於內置值類型,==判斷的是兩個對象的代數值是否相等。它會根據需要自動進行必要的類型轉換,並根據兩個對象的值是否相等返回true或者false。例如:
int x = 100;
Double y = 100;
if (x == y)
Response.Write("x==y!"); //x==y
而對於用戶定義的值類型,如果沒有重載==操作符,==將是不能夠使用的。
例如:
Struct Userstruct1;
Userstruct1 a;
Userstruct1 b;
If(a == b)
Console.WriteLine(“can == reach this far?”)
上面的這段代碼是不能夠通過編譯的。可以通過重載使==作用於用戶定義的值類型。
對於引用類型,== 默認的行爲與ReferenceEquals的行爲相同,僅有兩個對象指向同一個Reference的時候才返回true。
Equals():
Equals方法對於值類型和引用類型的定義不同,對於值類型,類型相同,並且數值相同(對於struct的每個成員都必須相同),則Equals返回true,否則返回false。而對於引用類型,默認的行爲與ReferenceEquals的行爲相同,僅有兩個對象指向同一個Reference的時候才返回true。可以根據需要對Equals進行重載,例如String類的Equals用於判斷兩個字符串的內容是否相等。
StringBuilder a = new StringBuilder();
a.Append("the test a");
String s1 = a.ToString();
String s2 = "the test a";
if (s2 == s1) //爲真,因爲S2,S1內容相等。String類的==與Equals的行爲相同,判斷兩個字符串的內容是否相等
Response.Write("== returns true");
if (Object.Equals(s2, s1)) //爲真,String類重載了Equals,用於判斷兩個字符串的內容是否相等
{
Response.Write("equals returns true");
}
if (Object.ReferenceEquals(s2, s1)) //爲假,因爲s2,s1並不是指向同一個對象
{
Response.Write("ReferenceEquals returns true");
}
注:對於String類,直接聲明s1 = “the test a”的話,輸出結果將包含 "ReferenceEquals returns true",因爲默認的,String對於聲明的相同的字符串在堆上只保留一個Copy,所以s1與s2將會指向相同的Reference。