zoukankan      html  css  js  c++  java
  • C# == 和 Equals

    先看一下解释

    msdn对于 

    == 的解释:

    对于预定义的值类型,如果操作数的值相等,则相等运算符 (==) 返回 true,否则返回 false。 对于 string 以外的引用类型,如果两个操作数引用同一个对象,则 == 返回 true。 对于 string 类型,== 比较字符串的值。


    equals的解释:

    如果当前实例是引用类型,Equals(Object)方法测试引用相等性,并调用Equals(Object)方法等效于调用ReferenceEquals方法。 引用相等性意味着进行比较的对象变量引用同一个对象
    如果当前实例是值类型,Equals(Object)方法测试值是否相等


    好像很明白了,但是下面存在一个问题,我也只是主观猜测

    static void Main(string[] args)
            {
                int t1 = 10;
                int t2 = 10;
    
                Console.WriteLine(t1 == t2);          //True
                Console.WriteLine(t1.Equals(t2));     //True
    
    
                object a1 = 15;
                object a2 = 15;
    
    
                Console.WriteLine(a1 == a2);        //False
                Console.WriteLine(a1.Equals(a2));   //True
    
                object b1 = new StringBuilder("a");
                object b2 = new StringBuilder("a");
                object b3 = b1;
                Console.WriteLine(b1==b2);          //False
                Console.WriteLine(b1.Equals(b2));   //False
                Console.WriteLine(b3 == b1);        //True
                Console.WriteLine(b3.Equals(b1));   //True
    
                Console.ReadLine();
            }


    分段讨论

    可以看到

    int t1 = 10;
    int t2 = 10;
    
    Console.WriteLine(t1 == t2); //True
    Console.WriteLine(t1.Equals(t2)); //True


    值类型的关系,无论==还是Equals,比较方式相同,都是比较值。
    返回2个true,毫无悬念


    2(问题在这里,了解的朋友可以详细的说一下,本人只是猜测)

    object a1 = 15;
    object a2 = 15;
    
    Console.WriteLine(a1 == a2); //False
    Console.WriteLine(a1.Equals(a2)); //True

    这个比较容易让人难以理解。
    其实很简单,我们看一下地址就知道了。


    可以看到,地址不一样。
    我没有详细研究原因,但是==可能比较了地址,而equals比较了值。


    3

    最后一个是引用比较。

    object b1 = new StringBuilder("a");
    object b2 = new StringBuilder("a");
    object b3 = b1;
    Console.WriteLine(b1==b2); //False
    Console.WriteLine(b1.Equals(b2)); //False
    Console.WriteLine(b3 == b1); //True
    Console.WriteLine(b3.Equals(b1)); //True


    可以看到,地址不同肯定就不同了。

    总结:

    最后在 闭包客closurer的回答,倒是最为合理与正确的:
    == 是静态函数,并不属于某个对象,编译器根据左右参数的类型去执行匹配的重载;
    Equals 是虚函数,可以在所有类型里面重写,这样即使调用的是 object 的 Equals,实际上调用的是 object 的具体对象的 Equals

  • 相关阅读:
    关于mvc、webapi中get、post、put、delete的参数
    sql2008清空日志
    Entityframework修改某个字段
    order by与索引
    Ninject中如果在抽象类中使用了属性注入,则属性必须设置为protected或public
    ViewData,ViewBag,TempData
    eurake高可用集群搭建 自我保护机制
    zookeeper 保证 CP

    JConsole工具监控java程序内存和JVM
  • 原文地址:https://www.cnblogs.com/hanjun0612/p/9779766.html
Copyright © 2011-2022 走看看