今后争取每两天能更新一次。平日的诱惑太多,双休只顾玩了,进度有点慢。
接上一讲的,类型的安全性,留下了点小尾巴——比较对象的相等性。
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()的两个方法有着详细的介绍。
下一篇讲,运算符的重载。