一起学习《C#高级编程》2--比较对象的相等性
今后争取每两天能更新一次。平日的诱惑太多,双休只顾玩了,进度有点慢。
接上一讲的,类型的安全性,留下了点小尾巴——比较对象的相等性。
C#有四种比较相等的方式:除了“==”运算符外,System.Object定义了3中方法:ReferenceEqual()方法和两种Equals();
1.首先是“==”运算符:
对于值类型,“==”比较两个值是否相等;而对于引用类型,“==”则是比较两个对象的引用地址是否相同。这里有个特例,就是string字符串类型,“==”是比较字符串的值而不是引用地址,这是因为系统重写了“==“运算符。关于运算符的重载,后面一讲会说。
2.ReferenceEqual()方法
ReferenceEqual()是静态方法,用于比较两个对象是否引用类的同一个实例,即引用自同一个内存中的地址。作为静态方法,不能被重写。如果两个引用 引用自同一个对象实例,则返回true,否则返回false。
SomeClass s1 = new SomeClass();
SomeClass s2 = new SomeClass();
SomeClass s3 = s1;
bool b1 = ReferenceEquals(null, null);
bool b2 = ReferenceEquals(s1, s2);
Console.WriteLine(b1); //true
Console.WriteLine(b2); //false,创建了不同实例,引用地址不同
Console.WriteLine(ReferenceEquals(s1, s3)); //true,s1,32引用地址相同
Console.WriteLine(ReferenceEquals(1, 1)); //flse,因为不是比较数值,而是比较引用地址
注意点:
因为ReferenceEquals()是比较引用类型的,当执行值类型间比较时,会采取装箱(上一讲提到)操作,把值类型转换为引用类型,所以会返回false。
bool b=ReferenceEquals(1,1); 会返回false值
3.虚拟的Equal()方法: Equals(Object)
说明:确定指定的 Object 是否等于当前的 Object。
因为是虚拟的方法,可以被重写。类似于“==”运算符,支持比较值类型和引用类型,其中string被当作值类型比较
4.静态的Equals()方法: Equals(Object,Object)
说明:确定指定的对象实例是否被视为相等。
关于Equals方法,书中也仅仅是简单介绍了下,详细解答可以参考MSDN文档:http://msdn.microsoft.com/zh-cn/library/System.Object.Equals(v=vs.100).aspx,上面对Equals()的两个方法有着详细的介绍。
下一篇讲,运算符的重载。
一起学习《C#高级编程》2--比较对象的相等性的更多相关文章
- Shell高级编程视频教程-跟着老男孩一步步学习Shell高级编程实战视频教程
Shell高级编程视频教程-跟着老男孩一步步学习Shell高级编程实战视频教程 教程简介: 本教程共71节,主要介绍了shell的相关知识教程,如shell编程需要的基础知识储备.shell脚本概念介 ...
- (转)跟着老男孩一步步学习Shell高级编程实战
原文:http://oldboy.blog.51cto.com/2561410/1264627/ 跟着老男孩一步步学习Shell高级编程实战 原创作品,允许转载,转载时请务必以超链接形式标明文章 原 ...
- 跟着老男孩一步步学习Shell高级编程实战
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://oldboy.blog.51cto.com/2561410/1264627 本sh ...
- 重学《C#高级编程》(对象与类型)
昨天重看了下<C#高级编程>里面的对象与类型一章,发现自己有许多遗漏没懂的地方重新弄清楚明白了 先说说什么是对象吧,我个人的感觉是:在编程的世界里,一段程序就是一个事物的处理逻辑,而对象就 ...
- Java学习进阶—高级编程
当你已经熟练的掌握了面向对象中的各种概念后,是否会对这些知识是如何使用的产生浓厚的兴趣?本课程主要针对于已经掌握了JAVA核心开发技术的读者准备,讲解了JAVA多线程.常用类库.IO编程.网络编程.类 ...
- python学习 面向对象高级编程
---恢复内容开始--- 面向对象编程---oop,是一种编程思想,oop把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数 ...
- 吴裕雄--天生自然 R语言开发学习:高级编程
运行的条件是一元逻辑向量(TRUE或FALSE)并且不能有缺失(NA).else部分是可选的.如果 仅有一个语句,花括号也是可以省略的. 下面的代码片段是一个例子: plot(x, y) } else ...
- C#高级编程9-第3章 对象与类型
类与结构 类和结构都是对象的模板 类定义了处理和访问数据的方法,通过类的实例化进行逻辑处理 类与结构的区别是类是引用类型,存储在托管堆上:结构是值类型,存储在栈上的: 类使用class进行修饰,结构使 ...
- IOS高级编程之一:多点触摸与手势验证
前段时间学习了IOS基础的一些控件的使用作为基础,现在开始学习一些高级编程的东西,手势处理器.文件I/O.定位.网络通信.多线程这些,分享一些学习的重点,还是很实用的. 今天就先介绍个简单点得,手势处 ...
- MVC高级编程+C#高级编程
本人今年的目标是学习MVC高级编程和C#高级编程,把自己的基础打的扎实,本文中值是一个开到,定期会在上面记录学习的技术点和心得就,加油吧!!!!!
随机推荐
- MySQL 存储配置
- 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #6 使用localmodconfig缩短编译时间
HACK #6 使用localmodconfig缩短编译时间 本节介绍使用make localmodconfig生成精简的.config文件,缩短内核编译时间的方法.为了能够应对各种各样的环境,发布版 ...
- Tessnet2 a .NET 2.0 Open Source OCR assembly using Tesseract engine
http://www.pixel-technology.com/freeware/tessnet2/ Tessnet2 a .NET 2.0 Open Source OCR assembly usin ...
- Eclipse去掉对jQuery的错误提示
1.I have found that I can leave the JavaScript Validator enable and ignore specific files by adding ...
- android处理Back键Home键和Menu键事件(转)
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BAC ...
- VS2008项目移植到Linux
不少人都遇到过这种情况:在Windows下用Visual Studio工具开发的程序需要移植到Linux系统中,做成Linux版本的,但程序比较大,在Linux上又离不开Make,手动编写Makefi ...
- android在开发过程中的数据库存储位置
1
- 323. Number of Connected Components in an Undirected Graph按照线段添加的并查集
[抄题]: Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of n ...
- java高级工程师(三)
一.独白 之前也面试别人,现在轮到自己找工作,怎么说呢,每个面试官的看法不一样,面试的方式就不一样,比如我面试别人我喜欢问项目中他用到了那些,然后针对用到的技术去问一些问题,或者说对于某些场景的一些技 ...
- Castle ActiveRecord学习(七)使用日志
暂无 参考:http://terrylee.cnblogs.com/archive/2006/04/14/374829.html