判断两个对象是否相同,关键是看这两个对象是否指向内存中的同一块内存。
先看例子:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 #region 判断两个对象是否相同:看是否指向同一块内存 6 Person p1 = new Person() 7 { 8 Name = "张三", 9 Age = 1810 };11 12 Person p2 = new Person()13 {14 Name = "张三",15 Age = 1816 };17 #endregion18 19 Console.ReadKey();20 }21 }22 23 public class Person24 {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 = 2015 };16 Console.ReadKey();17 }18 }19 20 public class Person21 {22 public string Name { get; set; }23 public int Age { get; set; }24 }
调试--》窗口--》即时,分别输入&p1,&p2,发现两个对象的内存地址不一样,说明这是两个不同的对象,只是这两个对象存储的内容相同。如下:
1 &p12 0x0694ecc83 *&p1: { 0}4 &p25 0x0694ecc46 *&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));//false10 Console.WriteLine(p1==p2);//false11 12 string[] names1 = new string [] { "张三","李四","王五" };13 string[] names2 = new string[] { "张三", "李四", "王五" };14 Console.WriteLine(names1.Equals(names2));//false15 Console.WriteLine(names1 == names2);//false16 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));//true20 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 Person15 {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 else29 {30 return false;31 }32 }33 else34 {35 return false;36 } 37 }38 }
输出true;