博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
判断两个对象是否相同
阅读量:5369 次
发布时间:2019-06-15

本文共 3410 字,大约阅读时间需要 11 分钟。

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

先看例子:

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     }
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 = 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}
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));//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
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 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     }
View Code

输出true;

 

转载于:https://www.cnblogs.com/wesley168/p/6435161.html

你可能感兴趣的文章
pandas的增删改查
查看>>
HDU 5933/思维
查看>>
字节对齐
查看>>
Design Tic-Tac Toe
查看>>
SQL中的去重操作
查看>>
uva 12097 - Pie(二分,4级)
查看>>
mongodb索引
查看>>
nginx源码学习资源(不断更新)
查看>>
【bzoj2882】工艺 后缀自动机+STL-map
查看>>
[redis] redis
查看>>
Linux的加密认证功能以及openssl详解
查看>>
[Tools] 使用XP远程登录Win8系统
查看>>
【RL-TCPnet网络教程】第38章 TFTP简单文件传输基础知识
查看>>
HDU- 2265 Encoding The Diary
查看>>
socket基本概念
查看>>
[第三方]SCNetworkReachability 获取网络状态控件使用方法
查看>>
在Windows上使用putty连接一台Linux主机
查看>>
Socket常见错误
查看>>
百度地图2.0API和3.0API。你想要的百度地图的这都有
查看>>
专业词汇
查看>>