比較字符串相等

  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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章