判断两个对象是否相同,关键是看这两个对象是否指向内存中的同一块内存。
先看例子:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 #region 判断两个对象是否相同:看是否指向同一块内存 6 Person p1 = new Person() 7 { 8 Name = "张三", 9 Age = 18 10 }; 11 12 Person p2 = new Person() 13 { 14 Name = "张三", 15 Age = 18 16 }; 17 #endregion 18 19 Console.ReadKey(); 20 } 21 } 22 23 public class Person 24 { 25 public string Name { get; set; } 26 public int Age { get; set; } 27 }
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Person p1 = new Person() 6 { 7 Name = "张三", 8 Age = 18 9 }; 10 11 Person p2 = new Person() 12 { 13 Name = "张三", 14 Age = 20 15 }; 16 Console.ReadKey(); 17 } 18 } 19 20 public class Person 21 { 22 public string Name { get; set; } 23 public int Age { get; set; } 24 }
调试--》窗口--》即时,分别输入&p1,&p2,发现两个对象的内存地址不一样,说明这是两个不同的对象,只是这两个对象存储的内容相同。如下:
1 &p1 2 0x0694ecc8 3 *&p1: {0} 4 &p2 5 0x0694ecc4 6 *&p2: {0}
案例二、
1 Person p1 = new Person(); 2 p1.Name = "张三"; 3 p1.Age = 20; 4 5 Person p2 = new Person(); 6 p2.Name = "张三"; 7 p2.Age = 20; 8 9 Console.WriteLine(p1.Equals(p2));//false 10 Console.WriteLine(p1==p2);//false 11 12 string[] names1 = new string [] {"张三","李四","王五" }; 13 string[] names2 = new string[] { "张三", "李四", "王五" }; 14 Console.WriteLine(names1.Equals(names2));//false 15 Console.WriteLine(names1 == names2);//false 16 17 string str1 = new string(new char[] { '1','2','3'}); 18 string str2 = new string(new char[] { '1', '2', '3' }); 19 Console.WriteLine(str1.Equals(str2));//true 20 Console.WriteLine(str1 == str2);//true
分别输出 false,false/false,false/true,true.
通过上面第一个案例,我们知道equals和==都是比较对象的地址,所以前面两个都是false很好理解,为何变成string类型后就不对了呢?原因是,所有的对象都继承了object,而object对象都有equals方法,但是不同的对象实现不一样。string的equals方法,重新后是判断对象的内容是否相同。而字符串中==内部也是调用equals实现的。所以用equals或者==来判断两个对象是否相同不准确。永远准确的方法是 Object.ReferenceEquals();
这里我们可以让案例二中的第一个例子输出true,只要在person类中重写equals方法就行了。代码如下:
1 Person p1 = new Person(); 2 p1.Name = "张三"; 3 p1.Age = 20; 4 5 Person p2 = new Person(); 6 p2.Name = "张三"; 7 p2.Age = 20; 8 9 Console.WriteLine(p1.Equals(p2)); 10 11 12 13 14 public class Person 15 { 16 public string Name { get; set; } 17 public int Age { get; set; } 18 19 public override bool Equals(Object obj) 20 { 21 Person p = obj as Person; 22 if (p != null) 23 { 24 if (p.Name==this.Name&&p.Age== this.Age) 25 { 26 return true; 27 } 28 else 29 { 30 return false; 31 } 32 } 33 else 34 { 35 return false; 36 } 37 } 38 }
输出true;