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

 

posted @ 2014-05-07 11:08  王若伊_恩赐解脱  阅读(526)  评论(0编辑  收藏  举报