|
|
|
|
|
下面是一個C# Equals()
方法的例子,執(zhí)行時報錯了
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
意思是空引用異常未處理;對象引用沒有設(shè)置為對象實例。
我們該如何分析其原因呢?這就需要理解一下==
運算符和 Equals()
方法的區(qū)別了。
==
運算符和 Equals()
方法都用于比較兩個值類型數(shù)據(jù)項或引用類型數(shù)據(jù)項。相等運算符 (==
) 是比較運算符,Equals()
方法比較字符串的內(nèi)容。==
運算符比較引用標識,而 Equals()
方法只比較內(nèi)容。讓我們看一些例子。
在下面示例中,我們將一個字符串變量分配給另一個變量。字符串是引用類型,在示例中,一個字符串變量被分配給另一個字符串變量,因此它們在堆中引用相同的標識,并且兩者具有相同的內(nèi)容,因此你可以獲得==
運算符和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();
}
}
}
現(xiàn)在運行程序,得到如圖1.1所示的結(jié)果
圖1.1 第一個程序的輸出
讓我們看另一個例子,其中兩個對象變量的內(nèi)容相同,但都有不同的引用。因此 ==
運算符返回 false,因為它比較引用標識,而 Equals()
方法返回 true,因為它比較對象的內(nèi)容。
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();
}
}
}
現(xiàn)在運行程序,得到如圖1.2 所示的結(jié)果。
圖 1.2 程序 2 的輸出
現(xiàn)在讓我們再回頭看文章開頭的出錯例子,該例子表明當你將空值分配給字符串變量并使用該變量時,Equals()
方法是字符串類的擴展方法,然后 Equals()
方法獲得空引用的異常,因此在調(diào)用 Equals()
方法時,你必須確保你的變量沒有空值。當你的一個變量包含空值時,你應該將該變量用作 Equals()
方法的參數(shù)。
圖 1.3 空引用異常
經(jīng)驗法則是,對于幾乎所有引用類型,當你想要測試相等性而不是引用標識時,請使用 Equals
,字符串除外;使用 ==
比較字符串確實使事情變得更簡單和更易讀,但你需要記住運算符的兩邊必須是字符串類型的表達式才能使比較正常進行。
相關(guān)文章