== 运算符和 Equals() 方法都用于比较两个值类型数据项或引用类型数据项。本文解释了这两者之间的基本区别。相等运算符 (==) 是比较运算符,而 Equals() 方法比较字符串的内容。 == 运算符比较引用标识,而 Equals() 方法只比较内容。让我们看一些例子。
在第一个例子中,我们将一个字符串变量分配给另一个变量。字符串是一种引用类型,在下面的例子中,一个字符串变量被分配给另一个字符串变量,所以它们在堆中引用的是相同的身份,并且都有相同的内容,所以你在==运算符和Equals()方法中都得到了True输出。
using System;
namespace ComparisionExample
{
class Program
{
static void Main(string[] args)
{
string name = "sandeep";
string myName = name;
Console.WriteLine("== operator result is {0}", name == myName);
Console.WriteLine("Equals method result is {0}", name.Equals(myName));
Console.ReadKey();
}
}
}
现在运行程序,得到如图 1.1 所示的结果
图 1.1 第一个程序的输出
让我们看看另一个例子,两个对象变量中的内容将是相同的,但两者的引用不同。所以==运算符返回假,因为它比较的是引用身份,而Equals()方法返回真,因为它比较的是对象的内容。
using System;
namespace ComparisionExample
{
class Program
{
static void Main(string[] args)
{
object name = "sandeep";
char[] values = {'s','a','n','d','e','e','p'};
object myName = new string(values);
Console.WriteLine("== operator result is {0}", name == myName);
Console.WriteLine("Equals method result is {0}", myName.Equals(name));
Console.ReadKey();
}
}
}
现在运行程序,得到如图 1.2 所示的结果
图 1.2 程序 2 的输出
现在让我们再看一个例子,说明Equals()方法是字符串类的一个扩展方法,当你给字符串变量分配一个空值,使用该变量时,Equals()方法就会得到一个空引用的异常,所以你必须确保你的变量在调用Equals()方法时没有空值。当你的一个变量包含一个空值时,那么你应该使用该变量作为Equals()方法的参数。
图 1.3 空引用异常
经验法则是,对于几乎所有的引用类型,当你想测试平等性而不是引用同一性时,使用Equals。字符串是个例外;用==来比较字符串确实让事情变得更简单、更易读,但你需要记住,运算符的两边必须是字符串类型的表达式,这样比较才能正常工作。