91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#之Equals與==

發布時間:2020-08-18 22:16:09 來源:ITPUB博客 閱讀:144 作者:hky87 欄目:編程語言

先來看一下C#關于類型的定義

C#之Equals與==

微軟doc: https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/value-types  


  1. 對于值類型而言,兩者比較的都是” 內容 ”是否相同,即  值是否一樣 ,很顯然此時兩者是劃等號的。

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

   ReferenceEquals:檢查同一性,看兩個引用是否指向同一個對象;


      字符串的比較

            string c = "abc";
            string d = "abc";
            Console.WriteLine("Equals(c,d):           {0}", Equals(c, d));//Ture
            Console.WriteLine("ReferenceEquals(c,d):  {0}",ReferenceEquals(c, d));//Ture
            Console.WriteLine("c==d:                  {0}",c == d);//Ture
            Console.WriteLine("c.Equals(d):           {0}",c.Equals(d));//Ture

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


自定義的類的比較

class Person
    {
        public string name;
        public int age;
        public Person(string name,int age)
        {
            this.name = name;
            this.age = age;
        }
    }
    
            Person p1 = new Person("P1", 10);
            Person p2 = new Person("P1", 10);
            
            Console.WriteLine("Equals(p1,p2):           {0}", Equals(p1, p2));//False
            Console.WriteLine("ReferenceEquals(p1,p2):  {0}", ReferenceEquals(p1, p2));//False
            Console.WriteLine("p1==p2:                  {0}", p1 == p2);//False
            Console.WriteLine("p1.Equals(p2):           {0}", p1.Equals(p2));//False
            
            p2 = p1;
            Console.WriteLine("Equals(p1,p2):           {0}", Equals(p1, p2));//True
            Console.WriteLine("ReferenceEquals(p1,p2):  {0}", ReferenceEquals(p1, p2));//True
            Console.WriteLine("p1==p2:                  {0}", p1 == p2);//True
            Console.WriteLine("p1.Equals(p2):           {0}", p1.Equals(p2));//True


對于 p1==p2 比較的結果是false,這點是毫無疑問的,因為他倆是兩個不同的變量,所以引用的地址也是不同的。

但是對于p1.Equals(p2) 返回false,可能有人會產生疑問,p1 和p2的內容是相同的啊,為什么他倆的比較結果卻是為false呢?。原因就在于在Equals是Object中的一個虛方法,而person類中沒有對它進行重寫,因此此時調用的仍是父類中的Equals方法。但是父類是無法知道你都有哪些成員字段的,因此返回的是false。

要想讓他能夠比較兩個變量的內容是否相同,那就應該在Person類中 重寫Equals方法


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



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


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

敖汉旗| 邻水| 微山县| 彩票| 岗巴县| 浪卡子县| 大埔区| 隆子县| 南充市| 博罗县| 沂南县| 佛学| 仁化县| 明星| 海阳市| 乳源| 根河市| 惠州市| 游戏| 右玉县| 临海市| 田阳县| 甘泉县| 股票| 榕江县| 子洲县| 清涧县| 延边| 芮城县| 新宾| 宁明县| 绥宁县| 合山市| 缙云县| 罗城| 桂东县| 鹿邑县| 建始县| 黑龙江省| 综艺| 龙岩市|