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

原文地址:https://www.cnblogs.com/hanjun0612/p/9779766.html