#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
總結:
1、就效率來說,在if語句中判斷時,當判斷true時,用==;判斷false時,用equals
2、值類型:兩者比較的都是值(内容)是否相同
3、引用類型:
equals表示的是兩個變量(的内容)是否是對同一對象的引用,堆中的内容是否相同
==表示兩個變量(的位址)在堆中存儲的位址是否相同,即棧中的内容是否相同。
4、對于自定義類而言,equals是父類object 的虛方法,是不知道自定義類的成員,是以equals比較傳回false,若要比較兩個變量的内容是否相同,應該重寫equals方法。