zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    LeetCode 023 Merge k Sorted Lists
    LeetCode 022 Generate Parentheses
    LeetCode 020 Valid Parentheses
    LeetCode 019 Remove Nth Node From End of List
    LeetCode 018 4Sum
    LeetCode 017 Letter Combinations of a Phone Number
    Linux常用命令详解(3)
    Linux常用命令详解(2)
    Linux常用命令详解(1)
    部署cobbler服务器
  • 原文地址:https://www.cnblogs.com/jilodream/p/4219822.html
Copyright © 2011-2022 走看看