C#之Equals與==-創(chuàng)新互聯(lián)

  1. 創(chuàng)新互聯(lián)公司專(zhuān)注為客戶(hù)提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站制作、成都做網(wǎng)站、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)、鹿邑網(wǎng)絡(luò)推廣、成都微信小程序、鹿邑網(wǎng)絡(luò)營(yíng)銷(xiāo)、鹿邑企業(yè)策劃、鹿邑品牌公關(guān)、搜索引擎seo、人物專(zhuān)訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們大的嘉獎(jiǎng);創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供鹿邑建站搭建服務(wù),24小時(shí)服務(wù)熱線:028-86922220,官方網(wǎng)址:muchs.cn

先來(lái)看一下C#關(guān)于類(lèi)型的定義

C#之Equals與==

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

  1. 對(duì)于值類(lèi)型而言,兩者比較的都是” 內(nèi)容 ”是否相同,即  值是否一樣 ,很顯然此時(shí)兩者是劃等號(hào)的。

  2. 對(duì)于引用類(lèi)型來(lái)說(shuō),等號(hào)(==)比較的是兩個(gè)變量的” 引用 ” 是否一樣,即是引用的” 地址 ”是否相同。而對(duì)于equals來(lái)說(shuō)仍然比較的是變量的  ” 內(nèi)容 ” 是否一樣。

   ReferenceEquals:檢查同一性,看兩個(gè)引用是否指向同一個(gè)對(duì)象;

      字符串的比較

            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是微軟封裝的一個(gè)字符串類(lèi),在內(nèi)部他已經(jīng)對(duì) = = 操作符進(jìn)行了重寫(xiě)。重寫(xiě)后他比較的則是兩個(gè)變量的內(nèi)容是否相同,重寫(xiě)后的 = = 操作符內(nèi)部調(diào)用的即是 equals 方法,所以輸出的是true

自定義的類(lèi)的比較

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

對(duì)于 p1==p2 比較的結(jié)果是false,這點(diǎn)是毫無(wú)疑問(wèn)的,因?yàn)樗麄z是兩個(gè)不同的變量,所以引用的地址也是不同的。

但是對(duì)于p1.Equals(p2) 返回false,可能有人會(huì)產(chǎn)生疑問(wèn),p1 和p2的內(nèi)容是相同的啊,為什么他倆的比較結(jié)果卻是為false呢?。原因就在于在Equals是Object中的一個(gè)虛方法,而person類(lèi)中沒(méi)有對(duì)它進(jìn)行重寫(xiě),因此此時(shí)調(diào)用的仍是父類(lèi)中的Equals方法。但是父類(lèi)是無(wú)法知道你都有哪些成員字段的,因此返回的是false。

要想讓他能夠比較兩個(gè)變量的內(nèi)容是否相同,那就應(yīng)該在Person類(lèi)中 重寫(xiě)Equals方法

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

總結(jié):Equals比較的永遠(yuǎn)是 變量的內(nèi)容 是否相同,而= =比較的則是 引用地址是否相同 (前提:此種類(lèi)型內(nèi)部沒(méi)有對(duì)Equals 或= = 進(jìn)行重寫(xiě)操作,否則輸出可能會(huì)有不同)。string 類(lèi)型是個(gè)特例,因?yàn)樗膬?nèi)部對(duì)這兩個(gè)都進(jìn)行了重寫(xiě)。

文章名稱(chēng):C#之Equals與==-創(chuàng)新互聯(lián)
當(dāng)前地址:http://muchs.cn/article46/degceg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、網(wǎng)站內(nèi)鏈網(wǎng)站維護(hù)、企業(yè)建站、ChatGPT、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開(kāi)發(fā)公司