先來看一下C#關于類型的定義
微軟doc: https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/value-types
對于值類型而言,兩者比較的都是” 內(nèi)容 ”是否相同,即 值是否一樣 ,很顯然此時兩者是劃等號的。
對于引用類型來說,等號(==)比較的是兩個變量的” 引用 ” 是否一樣,即是引用的” 地址 ”是否相同。而對于equals來說仍然比較的是變量的 ” 內(nèi)容 ” 是否一樣。
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是微軟封裝的一個字符串類,在內(nèi)部他已經(jīng)對 = = 操作符進行了重寫。重寫后他比較的則是兩個變量的內(nèi)容是否相同,重寫后的 = = 操作符內(nèi)部調(diào)用的即是 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,可能有人會產(chǎn)生疑問,p1 和p2的內(nèi)容是相同的啊,為什么他倆的比較結果卻是為false呢?。原因就在于在Equals是Object中的一個虛方法,而person類中沒有對它進行重寫,因此此時調(diào)用的仍是父類中的Equals方法。但是父類是無法知道你都有哪些成員字段的,因此返回的是false。
要想讓他能夠比較兩個變量的內(nèi)容是否相同,那就應該在Person類中 重寫Equals方法
public override bool Equals(object obj) { Person p = (Person)obj; return (this.name == p.name) && (this.age == p.age); }
總結:Equals比較的永遠是 變量的內(nèi)容 是否相同,而= =比較的則是 引用地址是否相同 (前提:此種類型內(nèi)部沒有對Equals 或= = 進行重寫操作,否則輸出可能會有不同)。string 類型是個特例,因為他的內(nèi)部對這兩個都進行了重寫。
文章名稱:C#之Equals與==-創(chuàng)新互聯(lián)
當前地址:http://www.chinadenli.net/article46/degceg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供微信小程序、網(wǎng)站內(nèi)鏈、網(wǎng)站維護、企業(yè)建站、ChatGPT、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)