C#中==、Equals、ReferenceEquals的区别
原文链接:http://www.studyofnet.com/news/1188.html
本文导读:
C#中Equals , == , ReferenceEquals都可以用于判断两个对象的个体是不是相等,对于相同的基本值类型,==和Equals()比较结果是一样的;由于ReferenceEquals()是判断两个对象的引用是否相等,对于值类型,因为每次判断前都必须进行装箱操作,也就是每次都生成了一个临时的object,因而永远返回false。
一、== 运算符
1、静态相等符号,对应存在的!=,这个符号是一个可以重载的二元操作符,可以用于比较两个对象是否相等。
2、它会根据需要自动进行必要的类型转换,并根据两个对象的值是否相等返回true或者false。
3、对于引用对象比较其引用(string引用类型除外,string是比较值)
4、对于值类型比较其值
5、某些内置的引用类型重载了==符号,例如string就重载==,使其比较的不是两个字符串的引用,而是比较的两个字符串字面量是否相等。
6、例如:
int i = ;
int j = ;
Console.WriteLine(i == j);//值类型比较代数值 输出True int m = ;
double n = 6.0;
Console.WriteLine(m == n);//类型自动转换并比较数值 输出True
object obj1 = new object();
object obj2 = new object();
Console.WriteLine(obj2==obj1);//引用类型比较引用 输出False
二、Equals
1、用于比较两个对象的引用是否相等。
2、然而对于值类型,类型相同(不会进行类型自动转换),并且数值相同(对于struct的每个成员都必须相同),则Equals返回 true,否则返回false。
3、对于引用类型,默认的行为与ReferenceEquals的行为相同,仅有两个对象指向同一个Reference的时 候才返回true。
4、可以根据需要对Equals进行重载
5、实例:
int i = ;
int j = ;
Console.WriteLine(i.Equals(j));//值类型比较 输出True int m = ;
double n = 6.0;
Console.WriteLine(m.Equals(n));//类型不会自动转换并比较数值 输出False object obj = new object();
object obj1 = new object();
object obj2 = new object();
Console.WriteLine(obj2.Equals(obj1));//引用类型比较 输出False
Console.WriteLine(obj1.Equals(obj));//引用类型比较 输出False
Console.WriteLine(obj2.Equals(string.Empty));//输出False,比较两对象的类型不同直接返回False
obj1 = obj;
obj2 = obj;
Console.WriteLine(obj2.Equals(obj1));//引用类型比较 输出True
Console.WriteLine(obj1.Equals(obj));//引用类型比较 输出True
三、ReferenceEquals
1、Object的静态方法,比较两对象的引用是否相等,值类型和引用类型都是一样。
2、不能在继承类中重写该方法。原型是:public static bool ReferenceEquals(object objA, object objB);FCL已经帮我们实现。它就是比较引用指向的内存地址是否一样。
3、对于2个值类型,ReferenceEquals永远都为false,因为使用ReferenceEquals(object a,object b)方法后值类型被重新装箱为新的引用类型实例,自然不会引用相等。
4、对于2个引用类型,ReferenceEquals则会比较它们是否指向同一地址。
5、实例:
int i = ;
int j = ;
Console.WriteLine(object.ReferenceEquals(i, j));//输出False int m = ;
double n = 6.0;
Console.WriteLine(object.ReferenceEquals(m, n));//输出False object obj = new object();
object obj1 = new object();
object obj2 = new object();
Console.WriteLine(object.ReferenceEquals(obj1, obj2));//输出False
Console.WriteLine(object.ReferenceEquals(obj1, obj));//输出False
obj1 = obj;
obj2 = obj;
Console.WriteLine(object.ReferenceEquals(obj1, obj2));//输出True
Console.WriteLine(object.ReferenceEquals(obj1, obj));//输出True
C#中==、Equals、ReferenceEquals的区别的更多相关文章
- java中equals和==的区别 (转)
java中equals和==的区别 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引 ...
- 【转】Java中equals和==的区别
[转]Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boole ...
- C#中 Equals和= =的区别
C#中 Equals和= =的区别 前言:最近感觉技术进步实在是太慢,一直被游戏缠身不能自拔哈哈,但是游戏打多了真的是感觉整个人浮躁的不行,所以我现在要去游戏多写代码多看书,今天在博客园中看到一个前辈 ...
- (转)Java中equals和==的区别
java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号( ...
- C# 中 equals( ) 和 == 的区别和用法
Equals: 下面的语句中,x.y 和 z 表示不为 null 的对象引用. * 除涉及浮点型的情况外,x.Equals(x) 都返回 true. * x.Equals(y) 返回与 y.Equal ...
- Java 中 Equals和==的区别(转)
另外一篇参考: https://blog.csdn.net/striverli/article/details/52997927 在谈论equals和==的区别前,我们先简单介绍一下JVM中内存分配的 ...
- Java中equals和==的区别?为什么重写equals方法后,一定要重写hashCode方法?
首先明确一点,equals是方法,==是操作符. 1. 如果比较的是基本数据类型: 只讨论==,因为equals是不存在的,因为java中基本数据类型不能调用method的. 2. 如果比较的是引用类 ...
- java中equals和==的区别详解
java中的数据类型,可分为两类: 1.基本数据类型. byte,short,char,int,long,float,double,boolean这八大原始数据类型他们之间的比较,使用“==”,比较的 ...
- C#中equals和==的区别有哪些
本文导读:C# 中==是用来判断变量的值是否相等,相等返回true,不相等返回false.Equals是用来判断两个对象(除string类型外)是否相等,相等的 条件是:值,地址,引用全相等,因为St ...
- java中equals()和==的区别
java中的数据类型 基础数据类型 基础数据类型有byte.short.char.int.long.float.double.bool.String.除了 String 会比较地址,其它的基础类型的比 ...
随机推荐
- js深浅复制
一.数组的深浅拷贝 <body> <script type="text/javascript"> var arr = ["One",&q ...
- MongoDB 数组
MongoDB是文档型数据库,每个文档(doc)表示数据的一项记录.相比关系型DB的row只能使用简单的数据类型,doc能够使用复杂的数据类型:内嵌doc,数组.MongoDB的数组是一系列元素的集合 ...
- [C#]想说一说嵌套数组
今天早上,随感而发,随便写了点东西.结果下午的时候看了看评论,吓我一跳.估计是不是写代码的人看散文看得太少了,还是因为现在的人读的书太少了,似乎有有些大惊小怪. 关于Y美女,我声明一下,尽管她很脱俗, ...
- WPF textblock加入超链接
<TextBlock Grid.Row=" Margin="75,0,0,0"> <Hyperlink Name="BlogHl" ...
- JavaScript JsTree实例
var RightTree= function () { }; RightTree.prototype = { //初始化权限树 InitRightTree: function () { $.ajax ...
- 百度sdk定位不成功,关闭定位
公司项目有用到百度地图,登录的时候需要定位一次,获取登录的地址信息,在手机无法连接外网的情况,也就无法访问百度定位服务器的时候,定位的回调函数要30秒以上才能返回结果,于是去仔细查百度api,发现没有 ...
- 1Z0-053 争议题目解析687
1Z0-053 争议题目解析687 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 687.Users are connected to a database instance th ...
- C#的DataTable操作方法
1.将泛型集合类转换成DataTable(表中无数据时使用): public static DataTable NullListToDataTable(IList list) { var result ...
- web前端学习随笔
为什么是随笔 好好算下来,学习web前端已有半个月了,这半个月来主要学习的是HTML和CSS部分,期间有困惑,也有解决困惑时的快感,所以想把这段时间感受到的一些东西记下来,因为内容比较杂,所以干脆叫随 ...
- 20款jQuery 的音频和视频插件
分享 20 款jQuery的音频和视频插件 Blueimp Gallery: DEMO || DOWNLOAD Blueimp gallery 主要为移动设备而设计,同时也支持桌面浏览器.可定制视频和 ...