判断两个对象是否相同

判断两个对象是否相同,关键是看这两个对象是否指向内存中的同一块内存。

先看例子:

 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     }
View Code
 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}
View Code

 案例二、

 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
View Code

分别输出  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     }
View Code

输出true;

原文地址:https://www.cnblogs.com/wesley168/p/6435161.html