对于这几点的区别网上经常有各种答案,而且常常会出现答案之间是互相矛盾的。要嘛就是根本含糊的解释不清楚,只是把测试结果扔上来并没有言简意赅的写出他们之间的比较。难道面试的时候考官问你,你也要在纸上写一大堆代码,然后告诉他这个结果是什么,那个结果是什么?后啦 扯远了。翻了下博客园和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()的比较的更多相关文章

  1. ReferenceEquals()、static Equals() 、instance Equals() 与 operator==之间的联系与区别

    当你创建一个用户自定义类型(类或结构)时,你需要给你的类型定义相等操作.C#中提供了几个不同的函数来验证两个对象是否满足“相等”的含义.public static bool ReferenceEqua ...

  2. 相等性 比较【ReferenceEquals、静态Equals、==(ceq)、实例eEquals】

    感觉 最近学习学疯了,突然对以前熟悉的东西感到陌生.然后又回头重新挖掘一下 什么是相等性呢?以前一直用== 默认是值相等,从未去考虑,是地址相等还值相等.今天就详细的研究一下. .net 平台提供了4 ...

  3. ==、Equals 、ReferenceEquals它们的异同

    链接 string foobar = "foobar"; string foobar2 = new StringBuilder().Append("foo"). ...

  4. C# ==、Equals、ReferenceEquals 区别与联系 (转载)

    相关概念 .Net提供了ReferenceEquals.静态Equals,具体类型的Equals以及==操作符这四个判等函数.但是这四个函数之间有细微的关系,改变其中一个函数的实现会影响到其他函数的操 ...

  5. C#基础知识之字符串比较方法:“==”操作符;RefernceEquals;String.Equals方法;String.Compare方法;String.CompareOrdinal方法。

    一.“==”操作符:String.Equals:ReferenceEquals 方法 1.在编程中实际上我们只需要这两种比较,c#中类型也就这两种 (1)值类型的比较:一般我们就是判断两个值类型实例各 ...

  6. 《Effective C#》:区别和认识四个判等函数

    .Net有四个判等函数?不少人看到这个标题,会对此感到怀疑.事实上确是如此,.Net提供了ReferenceEquals.静态Equals,具体类型的Equals以及==操作符这四个判等函数.但是这四 ...

  7. 【转】区别和认识.Net四个判等函数

    原文地址:不详 .Net有四个判等函数?不少人看到这个标题,会对此感到怀疑.事实上确是如此,.Net提供了ReferenceEquals.静态Equals,具体类型的Equals以及==操作符这四个判 ...

  8. C#的基类都有哪些方法

    之前面试有被问到这个问题,平时没去注意,回答的不好,在此整理一下. 在C#中,个方法,重载的方法没有算进来: 构造函数 ToString()函数 GetHashCode函数 Equals函数 Refe ...

  9. 《C#高效编程》读书笔记06-理解几个等同性判断之间的关系

    当创建自定义类型时(无论是class还是struct),应为类型定义"等同性"的含义.C#提供了4种不同的函数来判断两个对象是否"相等": public sta ...

随机推荐

  1. java分享第五天(数组)

    1 声明数组变量: double[] mylist;    or double mylist[]; 2 创建数组: 可以通过使用new运算符使用以下语法创建一个数组: arrayRefVar=new ...

  2. Js练笔——用循环和递归实现追踪对象深度(循环引用关系不考虑)

    function reobs(obj){ //返回对象中对象属性组成的数组 var a=[]; var b=[]; for(it in obj){ a.push(it); } for(var i=0; ...

  3. 从jQuery中学习来的另一种继承方式(技巧)

    遵从Js的原型链规则,利用js灵活的特性灵活地改造原型,可以实现各种创意地继承方式,昨天研究了jQuery,对作者实现继承的方式感到佩服,他对js原型和原型链的理解比较透彻,运用自如.这里给出jQue ...

  4. 采用Hibernate框架的研发平台如何能够真正兼容Oracle和sqlServer数据库

    都说Hibernate框架的使用可以很容易的让你的研发平台支持多种不同类型的数据库,但实践表明,这里的“容易”,是相对的. 想让研发平台支持多种数据库,并不是一件简单的事,也可以这么说:并不是只要使用 ...

  5. bootstrap 不兼容ie8 的问题

    官方推荐的脚手架中,其实已经包含着解决方案:html5shiv.min.js .Respond.min.js 但由于respond.js  使用 file:// 协议,IE8 是无法调起本地文件的   ...

  6. Python一般错误

    1. IndentationError: unindent does not match any outer indentation level 格式对齐的问题.Python对空格和Tab有严格区别

  7. Python脚本模拟登录网页之GitHub篇

    1. 通过Firefox配合插件Tamper Date获取登录时客户端向服务器端提交的数据, 并且发现authenticity_token这个字段每次登录时都不一样. POSTDATA=commit= ...

  8. Session 知识点再整理(二) 自定义 Session 存储机制

    对于访问量大的网站,用默认的 Session 存储方式(以文件存储)不适合,因为文件的 I/O 开销会非常大,另外 Session 机制本身使 Session 不能跨机访问,在 Web 集群中无法达到 ...

  9. 使用 U盘 重装 Mac OSX

    一.制作 U 盘系统启动盘 1.从 App Store 上下载 OS Application.(这里需要注意,取消下载完的自动更新,并存储下这个 OS.Application 文件,因为系统更新完后, ...

  10. QTreeWidget

    #include "dialog.h" #include "ui_dialog.h" #include<QtCore> #include<Qt ...