比较对象的相等性

需要理解对象相等的机制对逻辑表达式的编程很重要,另外,对实现运算符重载和类型强制转换也很重要.

对象相等的机制有所不同,这取决于比较的是引用类型还是值类型.

比较引用类型的相等性

System.Object定义了三个不同的方法来比较对象的相等性:ReferenceEquals()和Equals()两个版本,再加上比较运算符,实际上有四种进行相等比较的方式.

1.ReferenceEquals()方法

以下是ReferenceEquals()方法的定义

public static bool ReferenceEquals(object objA, object objB)

ReferenceEquals()是一个静态方法,测试两个引用是够引用类的同一个实例,特别是两个引用是否包含内存中的相同地址.作为静态方法,他不能重写,所以System.Object的实现代码保持不变.如果提供的两个引用引用同一个对象实例,则ReferenceEquals()总是返回true;否则就返回false.但是它默认 null等于null;

案例:

SomeClass x,y;

x=new SomeClass();

y=SomeClass();

bool b1=ReferenceEquals(null,null)  //返回真

bool b2=ReferenceEquals(null,x)  //返回假

bool b3=ReferenceEquals(x,y)  //返回假,因为x和y指向不同的对象

2.虚拟的Equals()方法

以下是Equals()方法的定义:

public virtual bool Equals(object obj)

返回一个值,该值指示当前的object是否等于当前的object.

Equals的默认实现仅支持引用相等,但派生类可重写此方法一直吃值相等.

在下面的列表中,x,y,z表示不为空的引用:

(1)除设计浮点型的情况外,x.Equals(x)都返回true

(2)x.Equals(y)返回与y.Equals(x)相同的值

(3)如果x和y都为NaN,则x.Equals(y)返回true.

(4)当且仅当x.Equals(z)返回true时,(x.Equals(y)&&y.Equals(z))才返回相同的值

(5)只要不修改x和y引用的对象,对x.Equals(y)的相机调用将返回相同的值

(6)x.Equals(null)返回false

案例:

public class Sample

{

public  void Method()

{

object obj1 = new object();

object obj2 = new object();

Console.WriteLine(obj1.Equals(obj2));//返回假

obj2 = obj1;

Console.WriteLine(obj1.Equals(obj2));//返回真

Console.ReadKey();

}

}

3.静态的Equals()方法

以下是静态的Equals()方法的定义

public static bool Equals(object objA , object objB)

如果objA是与objB相同的实例,或者如果两者均为空引用,或者如果objA.Equals(objB)返回true,则为true ,否则为false.

值类型的相等比较

在进行值类型的相等比较的时,采用与引用类型相同的规则:ReferenceEquals()用于比较引用,Equals()用于比较值.最大的区别是,值类型需要装箱才能把他们转换为引用,才能对他们执行方法.

ReferenceEquals()在应用值类型时,总是返回false,因为为了调用这个方法,值类型需要装箱到对象中.即使使用下面的代码:

int v = 10;

bool b = ReferenceEquals(v, v);

Console.WriteLine(b);//b返回false

因为在转换每个参数时,v都睡被单独装箱.

最新文章

  1. Entity Framework中使用IEnumerable<T>、IQueryable<T>及IList<T>的区别
  2. UItableView与UICollectionView
  3. JQuery lhgdialog使用
  4. 2016年上半年金融类App成绩单,手机银行优势尽显! (转自Analysys易观(ID:enfodesk))
  5. MxNet下训练alexnet(一)
  6. (2)redis的基本数据结构是动态数组
  7. [笔记]--Sublime Text 2使用技巧
  8. python学习笔记:python字符串
  9. RabbitMQ(2)
  10. strpos、 strstr、 substr三个函数的对比讲解
  11. KoaHub.js -- 基于 Koa.js 平台的 Node.js web 快速开发框架之koahub-yilianyun
  12. JS实现悬浮导航的制作--web前端
  13. Vue 波纹按钮组件
  14. Mac安装SecureCRT
  15. .Net core使用Autofac进行依赖注入示例
  16. SQLI DUMB SERIES-14
  17. leetCode58. 最后一个单词的长度
  18. k64 datasheet学习笔记10---Signal Multiplexing and Signal Descriptions
  19. [android] 手机卫士自定义组合控件
  20. 【struts2】Struts2的运行流程

热门文章

  1. 一个简单的Java程序
  2. 使用TensorFlow给花朵🌺分类
  3. 为你的 Hadoop 集群选择合适的硬件
  4. 通过微信Android和iOS版,看两大系统的差异
  5. NET Core中使用Angular2的Token base身份认证
  6. 032 Spark容错特性
  7. 006 jquery过滤选择器-----------(可见性过滤选择器)
  8. mysql varchar 转 decimal
  9. 每日踩坑 2018-09-29 .Net Core 控制器中读取 Request.Body
  10. bsgs算法详解