C#之Equals與==
先來看一下C#關於型別的定義
微軟doc: https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/value-types
-
對於值型別而言,兩者比較的都是” 內容 ”是否相同,即 值是否一樣 ,很顯然此時兩者是劃等號的。
-
對於引用型別來說,等號(==)比較的是兩個變數的” 引用 ” 是否一樣,即是引用的” 地址 ”是否相同。而對於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 型別是個特例,因為他的內部對這兩個都進行了重寫。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10314474/viewspace-2213811/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C#基礎之==(雙等於號)與equals()區別C#
- java字串“==”與“equals”的差異及與c#的區別Java字串C#
- C# 有關List<T>的Contains與Equals方法C#AI
- hashCode()與equals()
- Java之String的equals與contentEquals區別Java
- 淺析C#中的等號“==”和EqualsC#
- String物件的equals()與 = =物件
- C# 之 Hashtable 與 DictionaryC#
- C# 中的 == 和 equals()有什麼區別?C#
- .NET學習之“==”、“Equals”、“IComparable”
- Java中(==)與equals的區別Java
- equals與==的區別(詳解)
- 讓你徹底理解 “==”與 Equals
- equals與hashCode關係梳理
- Java物件之間的比較之equals和==Java物件
- C# 之委託與事件C#事件
- “==”、“equals()”、“hashcode()”之間的祕密
- 重寫equals()時為什麼也得重寫hashCode()之深度解讀equals方法與hashCode方法淵源
- Java面試題 equals()與"=="的區別?Java面試題
- String類中的equals方法與Object類中的equals方法的不同點Object
- 面試官愛問的equals與hashCode面試
- C#基礎之yield與SingletonC#
- JAVA程式設計習慣之equals對比Java程式設計
- java equalsJava
- java - equals()Java
- Java:比較運算子compareTo()、equals()、==之間的區別與應用總結Java
- Java基礎-- ==號與equals()方法的區別Java
- java中equals方法與==邏輯運算子薦Java
- 【轉載】C#之int與Java之Integer的區別C#Java
- C#基礎之checked與 unchecked的使用C#
- javaSE中的==和equals的聯絡與區別Java
- equals & hashCode
- java == 和equalsJava
- 【C#之控制檯與窗體應用程式】C#
- C#程式設計之委託與事件(一)C#程式設計事件
- C#程式設計之委託與事件(二)C#程式設計事件
- "a".equals(b)和b.equals("a")有什麼區別
- 你不知道的東西! c# == 等於運算子 和 Object.Equals()C#Object