1. 程式人生 > >字符串比較方法:“==”操作符;RefernceEquals;String.Equals方法;String.Compare方法;String.CompareOrdinal方法。

字符串比較方法:“==”操作符;RefernceEquals;String.Equals方法;String.Compare方法;String.CompareOrdinal方法。

影響 線程棧 ron 圖片 分布 根據 png -c span

一、“==”操作符;String.Equals;ReferenceEquals 方法

  1、在編程中實際上我們只需要這兩種比較,c#中類型也就這兩種

  (1)值類型的比較:一般我們就是判斷兩個值類型實例各自包含的值是否相等

  (2)引用類型的比較:由於引用類型在內存中的分布有兩部分,一個是引用類型的引用(存在於線程棧中),一個是引用類型的值(存在於托管堆);所以我們比較引用類型也就存在兩種比較

默認情況下:值類型比較的是兩個值是否相等(不裝箱情況下),引用類型比較的是兩個引用是否相等。

  2、字符串比較思路

  要判斷2個字符串變量是否相等,最高效的方法是看它們是否指向相同的內存地址,可以使用RefernceEquals方法來比較。如果2個變量指向的是不同的內存地址,那麽就需要逐字符的比較2個字符串的變量,才能確認它們是否相等。由於逐字比較會花費大量的時間,降低性能。所以.NET提供了String.Equals方法來優化比較過程該方法能自動地完成引用比較和值比較。

  “==”操作符,它實際上在底層是調用Equals方法,這是完成比較的一種簡捷方式。雖然Equals方法已經滿足了大多數的比較的需要,但是此方法沒有重載方法,不支持區分大小寫,和考慮每個國家的文化因素

  3、“==”操作符介紹

  • 對於值類型,==判斷的是兩個對象的代數值是否相等。它會根據需要自動進行必要的類型轉換,並根據兩個對象的值是否相等返回true或者false
  • 對於引用類型,則==一般情況下比較的這是引用類型的引用是否相等。(對於引用類型最好不要使用==符號進行相等性比較,避免混淆,因為string是經常需要操作,所以某些內置的引用類型重載了==符號,例如string就重載==,使其比較的不是兩個字符串的引用,而是比較的兩個字符串字面量是否相等。

  實例:

  值類型的==比較:雖然i和j在棧上具有不同的內存空間,但是他們的代數值都為5;m和n類型被自動轉換並比較代數值

int i=5, j = 5;
Console.WriteLine(i==j);//值類型比較代數值 輸出True


int m = 6;
double n = 6.0;
Console.WriteLine(m == n);//類型自動轉換並比較數值 輸出True

  引用類型==比較:如下代碼,兩個object對象都在堆上申請了空間,在線程棧上存在兩個不同的引用,所以輸出結果為False

object obj1 = new object();
object obj2 = new
object(); Console.WriteLine(obj2==obj1);//引用類型比較引用 輸出False

  4、Equals 介紹

  定義:Equals屬於Object的實例方法,用於比較兩個對象的引用是否相等,註意:對於Object對象比較的是引用!然而對於值類型,類型相同(不會進行類型自動轉換),並且數值相同(對於struct的每個成員都必須相同),則Equals返回 true,否則返回false。這是因為內置的值類型都重寫了Object.Equals方法,所以值類型的Equals方法與引用類型的Equals就產生了不同的效果。

  實例

  Equals在程序運行時決定比較的類型--根據對象的實際類型進行比較,根據對象的類型調用他們各自的Equals虛方法。

int i = 5;
int j = 5;
 Console.WriteLine(i.Equals(j));//值類型比較 輸出True

int m = 6;
double n = 6.0;
Console.WriteLine(m.Equals(n));//類型不會自動轉換並比較數值 輸出False

object obj1 = new object();
object obj2 = new object();
Console.WriteLine(obj2.Equals(obj1));//引用類型比較 輸出False
Console.WriteLine(obj2.Equals(string.Empty));//輸出False,比較量對象的類型不同直接返回False    

  5、ReferenceEquals 介紹

  定義:Object的靜態方法,比較兩對象的引用是否相等,值類型和引用類型都是一樣。

int i = 5;
int j = 5;
Console.WriteLine(object.ReferenceEquals(i, j));//輸出False,具有不同的內存空間

int m = 6;
double n = 6.0;
Console.WriteLine(object.ReferenceEquals(m, n));//輸出False,具有不同的內存空間

object obj1 = new object();
object obj2 = new object();
Console.WriteLine(object.ReferenceEquals(obj1, obj2));//輸出False,具有不同的內存空間

  6、ReferenceEquals;==;Equals異同

  (1)ReferenceEquals比較對象的引用是否相同,而且是安全的比較

  (2)==;Equals異同

    相同點: 對於值類型 都是比較代數值是否相等

    不同點:(1)對於值類型比較,==會進行類型的自動轉換,然後比較代數值,Equals則不會進行轉換,先比較類型,再比較值,如果類型不同直接返回false
        (2)==比較是安全的比較,也就是說兩對象為任何值都可以進行比較,不會拋出異常;而Equals的比較則是不安全的,由於在Equals在運行時才會進行真正的比較,有可能調用Equals的調用者是NULL,編譯通過,但是運行時則會拋出異常(所以對於引用類型是要使用實例的Equals進行比較時,一定不要忘記檢查調用者對象是否為空。)

技術分享圖片

二、String.Compare是一個比較靈活的比較方法,由於考慮到大小寫或文化因素,就可以使用此方法。因為它有許多重載的形式,可以接受大小寫或文化的參數,也支持子串比較。

  語法如下:

  int Compare(string str1,string str2);//指定要比較的字符串;

Compare(string str1,string str2,bool IgnoreCase);//bool IgnoreCase默認為false,如果是true,則不區分大小寫的比較。

Compare(string str1,string str2,bool IgnoreCase,CulureInfo ci);//CulureInfo ci,要使用的文化。

Compare(string str1,int index1,string str2,int index2,int len);//index1和index2分別表示str1和str2的起始位置。

  Compare返回一個表示比較結果的整數值,兩個字符相同,則返回0;如果第一個字符串小宇第二個字符串,則返回小於0;如果第一個字符串大於第二字符串,返回值大於0;

int result;

string str1="ABC";

string str2="abc";

result=string.Compare(str1,str2);//返回1,因為A比a大;

result=string.Compare(str1.str2,false);//返回1,區分大小寫;

result=string.Compare(str1,str2,ture);//返回0,不區分大小寫;

  在編寫程序是,要考慮的文化因素影響。.NET給各種文化的分別提供了一組準則,在執行Compare方法時,CLR會檢查相關文化,並使用相對應的準則。Compare方法提供了一個CultureInfo對象參數。

CultureInfo ci = new CultureInfo("cs-cz");

要明確的指定一個默認文化或者無文化信息,CultureInfo類提供了2個成員屬性,CurrentCulture(當前線程相關文化)和InvariantCulure(忽略文化因素),可以作為參數傳遞給方法。這樣使得程序具有自描性,可以清楚的這些方法是否受到文化的影響。

三、String.CompareOrdinal是對嚴格基於字符的序數值完成比較。它其實是使用一種簡單的算法來比較2個字符串的Unicode值。如果第一個字符串小於第二個字符串,則返回小於0;如果是2個字符串相等,返回0;如果第一個字符串大於第二字符串,則返回大於0的值。

string str1=“Abc”;

string str2=“abc”;

result=string.Compare(str1,str2,false,CultureInfo.InvariantCulture);//返回1,A比a大,不受文化影響。
result=string.CompareOrdinal(str1,str2);//返回負數-20。因為CompareOrdinal比較的是底層的Unicode值。A(U+0041)小於a(U+0061),所以第一個字符串小於第二個字符串。

字符串比較方法:“==”操作符;RefernceEquals;String.Equals方法;String.Compare方法;String.CompareOrdinal方法。