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 ...
随机推荐
- 应对Memcached缓存失效,导致高并发查询DB的四种思路(l转)
当Memcached缓存失效时,容易出现高并发的查询DB,导致DB压力骤然上升. 这篇blog主要是探讨如何在缓存将要失效时,及时地更新缓存,而不是如何在缓存失效之后,如何防止高并发的DB查询. 解决 ...
- 转自:C#中TextBox水印提示的简单实现
本文转自: 原作者: js2854 出处: http://js2854.cnblogs.com/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接 ...
- 李洪强iOS经典面试题下
李洪强iOS经典面试题下 21. 下面的代码输出什么? @implementation Son : Father - (id)init { self = [super init]; if (self) ...
- 可能碰到的iOS笔试面试题(4)--C语言
可能碰到的iOS笔试面试题(4)--C语言 可能碰到的iOS笔试面试题(4)--C语言 C语言,开发的基础功底,iOS很多高级应用都要和C语言打交道,所以,C语言在iOS开发中的重要性,你懂的.里面的 ...
- Linux_Shell
一.Shell 种类与归属 Unix与Linux常见的Shell脚本解释器有bash,sh,csh,ksh等(PS: bash 完全兼容sh) bash : linux 默认的shell sh : u ...
- scroll、offset和client的区别
整体布局: <!DOCTYPE> <head> <meta http-equiv="Content-Type" content="text/ ...
- asp.net 与数据库操作
<configuration> <system.web><compilation debug="true" targetFramework=" ...
- C/C++中的实参和形参
今天突然看到一道关于形参和实参的题,我居然不求甚解.藐视过去在我的脑海里只有一个参数的概念,对于形参和实参的区别还真的不知道,作为学习了几年C++的人来说,真的深深感觉对不起自己对不起C++老师 T ...
- mapminmax的用法详解 _MATLAB
============外一篇 有关mapminmax的用法详解 by faruto==================================转自:http://www.ilovematla ...
- Web前端开发基础 第四课(CSS小技巧1)
垂直居中-父元素高度确定的单行文本 父元素高度确定的单行文本的竖直居中的方法是通过设置父元素的 height 和 line-height 高度一致来实现的.如下代码: <div class=&q ...