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 管理内存的区域,主要有三块,分别为: 线程的堆栈,用于分配值类 ...
随机推荐
- 2016huasacm暑假集训训练五 G - 湫湫系列故事——减肥记I
题目链接:http://acm.hust.edu.cn/vjudge/contest/126708#problem/G 这是一个01背包的模板题 AC代码: #include<stdio.h&g ...
- dos清除缓存
ipconfig /flushdns ,DNS缓存就被清除了. ipconfig /displaydns查看DNS缓存
- 手机CPU和GPU厂商
CPU: 1.苹果 (Apple) A系列 ARM授权,基于Cortex-A系列架构 A5基于Cortex-A9架构,双核,主频800M-1Ghz,内存双通道32bitLPDDR2,GPU采用Powe ...
- ASP.NET Core 源码阅读笔记(1) ---Microsoft.Extensions.DependencyInjection
这篇随笔主要记录一下ASP.NET Core团队实现默认的依赖注入容器的过程,我的理解可能并不是正确的. DependencyInjection这个项目不大,但却是整个ASP.NET Core的基础, ...
- APP漏洞扫描器之本地拒绝服务检测详解
APP漏洞扫描器之本地拒绝服务检测详解 阿里聚安全的Android应用漏洞扫描器有一个检测项是本地拒绝服务漏洞的检测,采用的是静态分析加动态模糊测试的方法来检测,检测结果准确全面.本文将讲一下应用漏洞 ...
- 女生的最爱,装饰品。WPF也有,Adorner。(上海晒衣服理念)
说到装饰,不由要说到女性. 去年过年回家给我妈买了周大福项链,很明显就感觉待遇就不一样了,即使这样,还是被一个阿姨说应该买更重点的.看来钱这种东西果然是多一点才好.虽然自己无所谓,但让家里人更开心也是 ...
- EF连接PostgreSql
1.用nuget安装npgsql和EF 注意,Nuget一定要安装Npgsql的2.2.7版本,更高版本nuget在后面安装EF的时候无法自动解析. install-Package Npgsql -V ...
- RX(一)
建议,先去了解观察者模式. 前期工作:引入RX的包 build.gradle脚本里面的 dependencies{ compile 'io.reactivex:rxjava:1.1.0'compile ...
- 带你走近AngularJS - 基本功能介绍
带你走近AngularJS系列: 带你走近AngularJS - 基本功能介绍 带你走近AngularJS - 体验指令实例 带你走近AngularJS - 创建自定义指令 ------------- ...
- Eclipse 常用快捷键 (动画讲解)
Eclipse有强大的编辑功能, 工欲善其事,必先利其器, 掌握Eclipse快捷键,可以大大提高工作效率. 编辑相关快捷键 注释 Ctrl + / 快速修复 Ctrl + ...