C#equals與==的區別
阿新 • • 發佈:2018-12-22
#region string s1 = "hello"; string s2 = "hello"; char[] ch = { 'h', 'e', 'l', 'l', 'o' }; Console.WriteLine(s1.Equals(s2));//true Console.WriteLine((s1 == s2));//true Console.WriteLine(ch.Equals(s2));//false Console.WriteLine(ch.ToString() == s2);//false Console.WriteLine(ch.ToString().Equals(s2));//false string a = new string(new char[] { 'h', 'e', 'l', 'l', 'o' }); string b = new string(new char[] { 'h', 'e', 'l', 'l', 'o' }); Console.WriteLine(a == b);//true Console.WriteLine(a.Equals(b)); //true Console.WriteLine(a == s1);//true Console.WriteLine(a .Equals(ch));//false object g = a; object h = b; Console.WriteLine(g == h);//false Console.WriteLine(g.Equals(h));//true 引用string的equals Person p1 = new Person("張三"); Person p2 = new Person("張三"); Console.WriteLine(p1 == p2);//false Console.WriteLine(p1.Equals(p2));//false //原因:Equals是Object中的一個虛方法,而person類中沒有對她進行重寫,因此此時呼叫的仍是父類中的Equals方法。但是父類是無法知道你都有哪些成員欄位的,因此返回的是false Person p3 = new Person("李四"); Person p4 = p3; Console.WriteLine(p3 == p4);//true Console.WriteLine(p3.Equals(p4));//true int i = 10; int j = 10; Console.WriteLine("i,j的equals(內容的)比較" + i.Equals(j));//true Console.WriteLine("i,j的==(內容的)比較" + (i == j));//true Console.ReadKey(); #endregion
總結:
值型別:兩者比較的都是值(內容)是否相同
引用型別:
equals表示的是兩個變數(的內容)是否是對同一物件的引用,堆中的內容是否相同
==表示兩個變數(的地址)在堆中儲存的地址是否相同,即棧中的內容是否相同。
對於自定義類而言,equals是父類object 的虛方法,是不知道自定義類的成員,所以equals比較返回false,若要比較兩個變數的內容是否相同,應該重寫equals方法。