下面是一个C# Equals()
方法的例子,执行时报错了
static void Main(string[] args)
{
string name = "sandeep";
string myName = null;
Console.WriteLine("== operator result is {0}", name == myName);
Console.WriteLine("Equals method result is {0}", myName.Equals(name));
Console.ReadKey();
}
报错信息为:
NullReferenceException was unhandled
Object reference not set to an instance object.
Equals报错:NullReferenceException was unhandled
意思是空引用异常未处理;对象引用没有设置为对象实例。
我们该如何分析其原因呢?这就需要理解一下==
运算符和 Equals()
方法的区别了。
==
运算符和 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 第一个程序的输出
让我们看另一个例子,其中两个对象变量的内容相同,但都有不同的引用。因此 ==
运算符返回 false,因为它比较引用标识,而 Equals()
方法返回 true,因为它比较对象的内容。
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
,字符串除外;使用 ==
比较字符串确实使事情变得更简单和更易读,但你需要记住运算符的两边必须是字符串类型的表达式才能使比较正常进行。