[C#] == VS Equals

声明:本篇博客翻译自:https://www.codeproject.com/Articles/1111680/equalsequals-VS-Equals-in-Csharpspa

因为水平(技术水平+英语理解能力)有限/不足,确定会有所疏漏/错误,请及时指正。翻译

介绍:

在C#中,可使用“==”和一个可重载的"Equals()"方法来对变量进行比较。可是不少开发者并不知道二者之间的区别。在这篇博客中将讨论二者之间的区别和二者的使用场景。"=="和"Equals()"比较没有区别除了在作string的比较时。code

比较规则:C#中的比较无非是对值类型和引用类型进行比较。当对值类型进行比较时,比较的是值类型的“内容”;当对引用类型进行比较时,比较的是对象的引用是否相同(内存地址)而不是“内容”。上述规则对"=="和"Equals()"均适用。对象

场景一:值类型比较

当对值类型(int, double, byte etc)进行比较时, "=="和"Equals()"都是基于值类型的内容比较。当值类型的内容相同,则二者相等。blog

Console.WriteLine("Value Type Compare...");
int i = 10;
int y = 10;
Console.WriteLine(i == y);        // true
Console.WriteLine(i.Equals(y)); // true

场景二:引用类型比较

当对引用类型(object, interface)进行比较时,比较的是引用(内存地址)是否相同,下面代码中obj1和obj2使用"=="和“Equals”进行比较,结果为:false.尽管两个对象的内容同样的。可是内容地址不同。继承

class Customer
{
    public string Name { get; set; }
}

Customer obj1 = new Customer();
obj1.Name = "Jimmy-Yang";

Customer obj2 = new Customer();
obj2.Name = "Jimmy-Yang";

Console.WriteLine(obj1 == obj2);        // false
Console.WriteLine(obj1.Equals(obj2));   // false

若是obj1与obj2指向同一个引用(内存地址)。内存

Customer obj1 = new Customer();
obj1.Name = "Jimmy-Yang";

Customer obj2 = obj1;

Console.WriteLine(obj1 == obj2);        // true
Console.WriteLine(obj1.Equals(obj2));   // true

场景三:string比较

string类型是引用类型,那么下面代码中"str"建立一个string对象,而且在堆内存块上存储"test"字符。当建立str1后,虽然存储的内容同样,可是应该存储在不一样的内存区域。ci

object str = "test";
object str1 = "test";
Console.WriteLine(str == str1);         // true
Console.WriteLine(str.Equals(str1));    // ture

执行结果发现str与str1是相等的。这是为何呢?
注意:C#的string类型遵循一条内部的规则。若是str与str1的内容相同,则二者指向系统的的内存地址。所以“==”和"Equals"会返回true。开发

可是注意下面的代码,咱们建立了一个单独对象,而后赋值给string类型。此时“==”比较将返回false,Equals()将返回true。这是二者一个不一样的地方。get

object str = new string(new char[] { 't', 'e', 's', 't' });
object str1 = new string(new char[] { 't', 'e', 's', 't' });
Console.WriteLine(str == str1);         // false
Console.WriteLine(str.Equals(str1));    // true

场景四:编译时VS运行时

二者之间在作类型检查时的区别。==在编译时作类型检查;Equals()在运行时作类型检查。请看下面的代码,在“==”会有一个警告信息。

场景五:NULL

当比较的对象为null时,“==”不会抛出异常,"Equals()"比较null对象时,会直接crash。

使用场景

"=="是C#提供的一个运算符,“Equals()”是基类提供的一个虚方法,能够在子类中继承,并编写自身比较逻辑。换句话说,“==”是一个C#的一个特性,而Equals是OOP的一个特性。二者的区别一个基于单纯的内容和引用(内存地址)比较。另外一种是基于语义(Semantics, 此处我翻译成语义,其实更确切的应该是对象之间的含义)上的比较。例如:1 <> 10 (从技术层面上讲),可是现实生活中,1元=10角,此时1=10在含义上。

  • 若是单纯从技术层面上比较请使用“==”;
  • 若是从语义上比较(例如:1元=10角),你须要使用Equals方法并提供合适的比较逻辑。

总结

请看下面的表格:

    ==   Equals
Usage Technical based Semantic based
Value types Content based Comparison Content based Comparison
Objects Reference based Comparison Reference based Comparison
String  Content based Comparison Content based Comparison
String with no interning Reference based Comparison Content based Comparison
Type checking Compile time Run time
Nulls Works  Can crash
相关文章
相关标签/搜索