C#中Equals和==的比較

轉自:https://www.cnblogs.com/huangshuhua/p/6738944.html
一、值類型的比較

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

        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 類型是個特例,因爲他的內部對這兩個都進行了重寫。

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