一起学习《C#高级编程》2--比较对象的相等性
2014-12-21 20:38
197 查看
今后争取每两天能更新一次。平日的诱惑太多,双休只顾玩了,进度有点慢。
接上一讲的,类型的安全性,留下了点小尾巴——比较对象的相等性。
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#有四种比较相等的方式:除了“==”运算符外,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#高级编程--比较对象的相等性
- C#学习,对象的相等比较
- GUI编程学习第一弹:《计算器》。尽量面相对象,但依然不给力。仍旧全文注释,大家一起勉励
- 黑马程序员-JAVA学习之字符串对象的创建和比较
- 一起学习《C#高级编程》3--运算符重载
- 一起学习《C#高级编程》1--类型的安全性
- Java中对象的比较 == 和 equals() -Java 学习笔记 (15)
- 《C#高级编程》【第三章】对象和类型 -- 学习笔记
- JAVA学习笔记(5)_____String对象比较的一些个人见解
- 【JAVA学习】java中==、equals()、hashCode()都和对象的比较有关,在java中这三者各有什么用处呢,即java中为什么需要设计这三种对象的比较方法呢?
- java学习(十六):对象的自定义比较,Comparator和Comparable
- 比较两个对象相等、克隆 、是否允许实例化继承 CLR学习第六课
- 收集学习asp.net比较完整的面向对象开发流程
- 收集学习asp.net比较完整的面向对象开发流程
- java中string 类型的对象间比较的学习笔记
- J2SE学习笔记:Set集合中相等性的比较,hashCode()与equals()
- Ruby中对象的相等性比较
- OOP编程比较学习__C++ & JAVA (一)定义类和创建对象
- 不要急,我与你一起学习JSP(六)——JSP 内置对象之一
- java 学习实例,实现空对象,和重写了,Comparator 的类实现了对于容器的比较!