Equals和ReferenceEquals
稍微分析下一下两个方法的区别:
public static bool Equals(object objA, object objB);
public static bool ReferenceEquals(object objA, object objB);
Q0:两者有什么区别?
一般情况下区别不大,但是当public static bool Equals(object objA, object objB);但是当某个类中被重写了
Q:值类型的数据我们可以使用public static bool Equals(object objA, object objB);比较吗?
可以,一般的值类型比如Int32,都重写了基类的 public virtual bool Equals(object obj);方法。但是更是重载了“==”这样的操作,而且不用装箱!!
Q1:我们想比较两个对象是否为同一个对象,我们使用哪一个呢?
比如我们自定义了一个类A,声明类A的两个对象a1和a2.
一般情况下我们选择ReferenceEquals比较对象相等,因为ReferenceEquals,恰如其名,就是用来比较 不同的对象 在堆上的分配的地址是否是同一块地址。
但是我们可以使用上面的Equals吗?一般情况下也是可以的,但是如果A重写了Object的 public virtual bool Equals(object obj);我们就应该注意了! 为啥呢?
我们使用reflector查看public static bool Equals(object objA, object objB);其内部实现如下:
public static bool Equals(object objA, object objB)
{
return ((objA == objB) || (((objA != null) && (objB != null)) && objA.Equals(objB)));
}
当我们选用public static bool Equals(object objA, object objB);比较两个对象的时候,其调用了public virtual bool Equals(object obj);而这个方法是virtual修饰的,说明可以被重写。当类A重写了方法public virtual bool Equals(object obj);的时候,往往会出现多态现象。
所以,public static bool Equals(object objA, object objB)比较对象 是通过重写后的public virtual bool Equals(object obj)来比较(如果该方法被派生的类重写)。而ReferenceEquals就是判断不同的对象是否在同一块堆上。
Q2.如何对比string s1=“123”和string s2=“123”当中s1和s2是否是同一块堆上分配的?
如果你使用Object.Equals(s1,s2)对比的话,其实你是调用了String类的public override bool Equals(object obj)方法进行的比较,这个方法的内部我们不细究了。正确的做法是我们要使用Object.ReferenceEquals(s1,s2)进行比较。
Q3.自己动手重写Object的public virtual bool Equals(object obj);方法
比如,一个类中既包含引用类型,又包含值类型,那么该类的两个对象怎么才算Equals呢?这里需要我们自定义了Equals的实现了。因为我们不自定义,而使
public static bool Equals(object objA, object objB);或者ReferenceEquals只能得出这两个对象是否在同一块堆上,这样往往不太合理。()
Equals和ReferenceEquals的更多相关文章
- C#中==、Equals、ReferenceEquals的区别
原文链接:http://www.studyofnet.com/news/1188.html 本文导读: C#中Equals , == , ReferenceEquals都可以用于判断两个对象的个体是不 ...
- C# "=="、Equals()、ReferenceEquals()区别
对于值类型: ; ; 1.== 比较的是值内容 2.age2.Equals(age1) = false; Equals比较前需要转换成同类型,age1(int型)需显示转换成byte型 3.age1. ...
- ==、Equals 、ReferenceEquals它们的异同
链接 string foobar = "foobar"; string foobar2 = new StringBuilder().Append("foo"). ...
- 如何使用==操作符,Equals方法,ReferenceEquals方法,IEquatable接口比较2个对象
"世界上不会有两片完全相同的树叶",这句话适用于现实世界.而在软件世界中,这句话变成了"世界上必须有两片完全相同的树叶",否则,很多事情无以为继. 当比较2个对 ...
- C# ==、Equals、ReferenceEquals 区别与联系 (转载)
相关概念 .Net提供了ReferenceEquals.静态Equals,具体类型的Equals以及==操作符这四个判等函数.但是这四个函数之间有细微的关系,改变其中一个函数的实现会影响到其他函数的操 ...
- [c#基础]值类型和引用类型的Equals,==的区别
引言 最近一个朋友正在找工作,他说在笔试题中遇到Equals和==有什么区别的题,当时跟他说如果是值类型的,它们没有区别,如果是引用类型的有区别,但string类型除外.为了证实自己的说法,也研究了一 ...
- C#基础知识之字符串比较方法:“==”操作符;RefernceEquals;String.Equals方法;String.Compare方法;String.CompareOrdinal方法。
一.“==”操作符:String.Equals:ReferenceEquals 方法 1.在编程中实际上我们只需要这两种比较,c#中类型也就这两种 (1)值类型的比较:一般我们就是判断两个值类型实例各 ...
- CSharp 相关知识点小结
1.JS获取iframe下面的内容document.getElementById('IFRAME1').contentDocument; 2.dialog 弹出层,定位:postion:'bottom ...
- .net 读书笔记
好书不能只读一遍,这两天又翻看了一遍<你必须知道的.NET>,重温了下基础,重温了下经典,简单记录了下来. 内存分配:CLR 管理内存的区域,主要有三块,分别为: 线程的堆栈,用于分配值类 ...
随机推荐
- SQL Server 高级sql总结
----------------------------------------------------------------------Select------------------------ ...
- C#中ToString格式大全
更多资源:http://denghejun.github.io C 货币 2.5.ToString("C") ¥2.50 D 十进制数 25.ToString("D5&q ...
- 深入NSQ 之旅[转载]
介绍 NSQ是一个实时的分布式消息平台.它的设计目标是为在多台计算机上运行的松散服务提供一个现代化的基础设施骨架.这篇文章介绍了 基于go语言的NSQ的内部架构,它能够为高吞吐量的网络服务器带来 性能 ...
- 尝试解决在构造函数中同步调用Dns.GetHostAddressesAsync()引起的线程死锁
(最终采用的是方法4) 问题详情见:.NET Core中遇到奇怪的线程死锁问题:内存与线程数不停地增长 看看在 Linux 与 Windows 上发生线程死锁的后果. Linux: Microsoft ...
- 避免Castle Windsor引起的内存泄露
原文地址: http://nexussharp.wordpress.com/2012/04/21/castle-windsor-avoid-memory-leaks-by-learning-the-u ...
- HTML5特性速记图
今天推荐大家一张HTML5特性速记图,供大家平时查阅,也可以打印放在电脑旁帮助速记.速查.此图笔者收集于网络图片.
- Redis高可用分布式内部交流(九)
这是上月在公司内部的一次分享,现把PPT及交流内容整理成博客. 阅读目录: 高可用 数据同步 分布式 分布式集群时代 总结 高可用 高可用(High Availability),是当一台服务器停止服务 ...
- AngularJS2 + ASP.NET MVC项目
环境:VS2015, NodeJS:v 6.5, npm: v3.10, AngularJs 2 通过将ASP.NET MVC项目与Angualr 2官网上的quick start整合的过程中遇到些问 ...
- 每天一个linux命令(49):at命令
在windows系统中,windows提供了计划任务这一功能,在控制面板 -> 性能与维护 -> 任务计划, 它的功能就是安排自动运行的任务. 通过'添加任务计划'的一步步引导,则可建立一 ...
- Gamma函数是如何被发现的?
学过微积分的人,肯定都接触过Euler积分,按教科书上的说法,这是两种含有参变量的定积分,但其实没那么玄乎,它们只是两个函数.其中第一型Euler积分叫\(B\)-函数,第二型Euler积分叫\(\G ...