1. 程式人生 > >C# 的 String.CompareTo Equals和==的比較

C# 的 String.CompareTo Equals和==的比較

urn 比較 我們 name pos return www 字母 string

String.CompareTo 語法

public int CompareTo(
string strB
)

返回值

  • 小於 0,實例小於參數 strB;
  • 0,實例等於參數 strB;
  • 大於 0,實例大於參數 strB,或者 strB 是 null 引用。

比較程序

並不是按字符串長度來比較的,而是:

  • 比較兩個字符串的第一個字符:相等則比較第二個,不相等則直接返回結果;
  • 比較兩個字符串的第二個字符:相等則比較第三個,不相等則直接返回結果;
  • 比較兩個字符串的第三個字符:相等則比較第四個,不相等則直接返回結果;
  • ……

誰大誰小?

實例大還是 strB 大,這是受計算機區域設置影響的,對於我們的中國區域設置,默認為:

null<零長度字符串<0<1<2<...<9<a<b<c<...<z<...<阿<...<不<...<吃<...<這<...

需要說明數字、字母也是拆開一個一個的比較的,比如:字符串 "200" 是小於 "3" 的,因為 "2" 小於 "3"。

string a = "阿";
string b = "不";
string c = "吃";

if (a.CompareTo(b) > 0)
{
Response.Write(a + "&gt;" + b + "<br>");
}
else if (a.CompareTo(b) < 0)
{
Response.Write(a + "&lt;" + b + "<br>");
}

if (b.CompareTo(c) > 0)
{
Response.Write(b + "&gt;" + c + "<br>");
}
else if (b.CompareTo(c) < 0)
{
Response.Write(b + "&lt;" + c + "<br>");
}

結果為:

阿<不
不<吃

改一下區域設置

在“控制面板”中,打開“區域和語言選項”,在“區域選項”中單擊“自定義”,在“排序”標簽中選擇“筆劃”,一路確定。然後關閉 Visual Web Developer(假設我們是在 VWD 中進行的實驗),再打開之,運行網站。

排序變成了:

阿>不
不<吃

因為這是按筆劃來的(“不”在這裏筆劃最少),不再是按拼音來的。我們改的這個區域設置只影響了中文,沒有影響到數字和字母等。

所以

所以 CompareTo 很少用,不要用 CompareTo 來比較兩個字符串是否相等,要用 Equals。

======================================================================================================================

Equals和==的比較

一、值類型的比較

對於值類型來說 兩者比較的都是內容”是否相同,即 值 是否一樣,很顯然此時兩者是劃等號的。

            int i = 9;
            int j = 9;
            Console.WriteLine("i==j"+(i==j)); //true
            Console.WriteLine("i.Equals(j)"+(i.Equals(j)));  //true

二、引用類型的比較

對於引用類型來說,等號(==)比較的是兩個變量的引用 是否一樣,即是引用的”地址是否相同。而對於equals來說仍然比較的是變量的 內容 是否一樣。

1、字符串的比較

            string s1 = "abc";
            string s2 = "abc";
            Console.WriteLine("s1==s2"+(s1==s2));//true
            Console.WriteLine("s1.Equals(s2)"+(s1.Equals(s2)));//true

string是微軟封裝的一個字符串類,在內部他已經對 = = 操作符進行了重寫。重寫後他比較的則是兩個變量的內容是否相同,重寫後的 = = 操作符內部調用的即是 equals 方法,所以輸出的是true

2、 自定義的其他引用類型——一 person類為例

            Person p1 = new Person("aa",18);
            Person p2 = new Person("aa",18);
            Console.WriteLine("p1==p2"+(p1==p2));//false
            Console.WriteLine("p1.Equals(p2)"+p1.Equals(p2));//false

對於 p1==p2 比較的結果是false,這點是毫無疑問的,因為他倆是兩個不同的變量,所以引用的地址也是不同的。但是對於p1.Equals(p2) 返回false,可能有人會產生疑問,p1 和p2的內容是相同的啊,為什麽他倆的比較結果卻是為false呢?。原因就在於在Equals是Object中的一個虛方法,而person類中沒有對她進行重寫,因此此時調用的仍是父類中的Equals方法。但是父類是無法知道你都有哪些成員字段的,因此返回的是false。要想讓他能夠比較兩個變量的內容是否相同,那就應該重寫Equals方法

public override bool Equals(object obj)
        {
            Person p = (Person)obj;
            return (this.Name == p.Name) && (this.Age == p.Age);
        }

總結:Equals比較的永遠是變量的內容是否相同,而= =比較的則是引用地址是否相同(前提:此種類型內部沒有對Equals 或= = 進行重寫操作,否則輸出可能會有不同)。string 類型是個特例,因為他的內部對這兩個都進行了重寫。

C# 的 String.CompareTo Equals和==的比較