ReferenceEquals和 == 和equals()的比较
对于这几点的区别网上经常有各种答案,而且常常会出现答案之间是互相矛盾的。要嘛就是根本含糊的解释不清楚,只是把测试结果扔上来并没有言简意赅的写出他们之间的比较。难道面试的时候考官问你,你也要在纸上写一大堆代码,然后告诉他这个结果是什么,那个结果是什么?后啦 扯远了。翻了下博客园和msdn 大致的结果如下(其实二者的差别是非常小的,再加上几乎很少有人用到这些特殊的点,所以会被人们所遗忘):
区分:
【ReferenceEquals】
根据名字就可以看出来这个关键字是纯粹的比较引用。
1.ReferenceEquals用于比较引用类型。
2.如果比较的是值类型(会自动装箱),则返回false。
【Equals】
1.Equals用于比较值类型和引用类型。
2.可以被子类重写。//因为他是个方法
3.如果不重写Equals方法,Equals方法效果与==一样,引用类型比较引用,值类型比较值。
4.如果重写Equals方法,需要重写GetHashcode方法,当该类作为键值对的键时,需要唯一的Hashcode,所以此时的GetHashcode方法需要被重写。
【==】
1.==用于比较值类型和引用类型。
2.引用类型比较引用,值类型比较值。
--------------------------------------------------------------------------------------------
比较
1.对于值类型,如果对象的值相等,则相等运算符 (==) 返回 true,否则返回 false。
2.对于string 以外的引用类型,如果两个对象引用同一个对象,则 == 返回 true。
3.* 对于string 类型,== 比较字符串的值。
总结:
==操作比较的是两个变量的值是否相等。
equals()方法比较的是两个对象的内容是否一致(包括地址),即equals比较引用类型是否是对同一个对象的引用。
*注:第3点中讲到的string 类型用"=="比较字符串值,其实是不正确的。只是外在的表现如此。因为在C#中,会存在字符串留用。在实际的后台操作中仍是采用比较引用对象。
那一丁点区别
==是一个逻辑运算符,判断运算符两边的数值或类型是否相等
而Equals是一个方法,虽然两个者有相近的意近,但还是有所不能的,在C#,所有的类型都是从Object继承,作为Object的回个方法之一的Equals就会被继承下来,所以能用来判断,但==这个运算符就不一定了,下面举个例子
struct AA
{
public int i;
}
static void Main(string[] args)
{
AA a = new AA();
a.i = 100;
AA c = new AA();
c.i = 101;
Console.WriteLine ( a==c );
Console.WriteLine(a.Equals (c));
}
你会发现a==c会报错,说==不支持这种判断,但a.Equals(c)是没错的,因为struct也继承至Object。
参考文献
http://www.cnblogs.com/fb-boy/p/3460986.html
http://social.msdn.microsoft.com/Forums/zh-CN/e75fec04-b12f-4bf4-9d9d-7d3815c49d60/-equals-?forum=visualcshartzhchs
ReferenceEquals和 == 和equals()的比较的更多相关文章
- ReferenceEquals()、static Equals() 、instance Equals() 与 operator==之间的联系与区别
当你创建一个用户自定义类型(类或结构)时,你需要给你的类型定义相等操作.C#中提供了几个不同的函数来验证两个对象是否满足“相等”的含义.public static bool ReferenceEqua ...
- 相等性 比较【ReferenceEquals、静态Equals、==(ceq)、实例eEquals】
感觉 最近学习学疯了,突然对以前熟悉的东西感到陌生.然后又回头重新挖掘一下 什么是相等性呢?以前一直用== 默认是值相等,从未去考虑,是地址相等还值相等.今天就详细的研究一下. .net 平台提供了4 ...
- ==、Equals 、ReferenceEquals它们的异同
链接 string foobar = "foobar"; string foobar2 = new StringBuilder().Append("foo"). ...
- C# ==、Equals、ReferenceEquals 区别与联系 (转载)
相关概念 .Net提供了ReferenceEquals.静态Equals,具体类型的Equals以及==操作符这四个判等函数.但是这四个函数之间有细微的关系,改变其中一个函数的实现会影响到其他函数的操 ...
- C#基础知识之字符串比较方法:“==”操作符;RefernceEquals;String.Equals方法;String.Compare方法;String.CompareOrdinal方法。
一.“==”操作符:String.Equals:ReferenceEquals 方法 1.在编程中实际上我们只需要这两种比较,c#中类型也就这两种 (1)值类型的比较:一般我们就是判断两个值类型实例各 ...
- 《Effective C#》:区别和认识四个判等函数
.Net有四个判等函数?不少人看到这个标题,会对此感到怀疑.事实上确是如此,.Net提供了ReferenceEquals.静态Equals,具体类型的Equals以及==操作符这四个判等函数.但是这四 ...
- 【转】区别和认识.Net四个判等函数
原文地址:不详 .Net有四个判等函数?不少人看到这个标题,会对此感到怀疑.事实上确是如此,.Net提供了ReferenceEquals.静态Equals,具体类型的Equals以及==操作符这四个判 ...
- C#的基类都有哪些方法
之前面试有被问到这个问题,平时没去注意,回答的不好,在此整理一下. 在C#中,个方法,重载的方法没有算进来: 构造函数 ToString()函数 GetHashCode函数 Equals函数 Refe ...
- 《C#高效编程》读书笔记06-理解几个等同性判断之间的关系
当创建自定义类型时(无论是class还是struct),应为类型定义"等同性"的含义.C#提供了4种不同的函数来判断两个对象是否"相等": public sta ...
随机推荐
- RSA加密算法原理及RES签名算法简介
第一部分:RSA算法原理与加密解密 一.RSA加密过程简述 A和B进行加密通信时,B首先要生成一对密钥.一个是公钥,给A,B自己持有私钥.A使用B的公钥加密要加密发送的内容,然后B在通过自己的私钥解密 ...
- Rockey 4加密狗介绍
Rockey 4加密狗介绍 特点:该加密狗是单片机加密狗时代飞天公司的主力产品,R4一样继承了R2的硬件特征,具有全球唯一性硬件ID.R4内置了硬件随机数生成器,可以进行一些抗跟踪,或在硬件算法中参与 ...
- 兼容所有浏览器的设为首页收藏本站js代码
大家发现传统的收藏本站按钮在360浏览器下面没有效果了,但是360浏览器用户群却非常之大.所以我们在网上找到一个兼容所有浏览器的收藏本站解决方案,具体功能如下: 设为首页 和 收藏本站js代码 兼容I ...
- 李洪强漫谈iOS开发[C语言-047]-数列求和
// // main.c // 53 - 数列求和 - 李洪强 // // Created by vic fan on 16/10/15. // Copyright © 2016年 李洪强. ...
- jsTree 的简单用法--异步加载和刷新数据
首先这两个文件是必须要引用的,还有就是引用 jQuery 文件就不说了: <link href="/css/plugins/jsTree/style.min.css" rel ...
- jQuery还原select下拉列表和清空input的值,回显下拉列表框的值
实现用jQuery还原select下拉列表的值,用了很多种方式,花了一些时间,最后重要找到一种可以实现的方式, 页面上有这些内容 <select id ="level" na ...
- centos MariaDB10.1.X galera cluster
[mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.1.12/centos6-amd64 gpgkey=https://yum.m ...
- 【转】CSRF攻击的应对之道
CSRF 背景与介绍CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一.其他安全隐患,比如 ...
- Java程序设计 实验三
北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1353 姓名:李海空 学号:20135329 成绩: 指 ...
- spring-session整合
如果项目之前没有整合过spring-data-redis的话,这一步需要先做,在maven中添加这两个依赖: <dependency> <groupId>org.spr ...