技術(shù)頻道導(dǎo)航
HTML/CSS
.NET技術(shù)
IIS技術(shù)
PHP技術(shù)
Js/JQuery
Photoshop
Fireworks
服務(wù)器技術(shù)
操作系統(tǒng)
網(wǎng)站運(yùn)營

贊助商

分類目錄

贊助商

最新文章

搜索

[原因分析]C# Equals()方法報(bào)錯:NullReferenceException was unhandled

作者:admin    時(shí)間:2023-6-12 18:23:3    瀏覽:

下面是一個(gè)C# Equals()方法的例子,執(zhí)行時(shí)報(bào)錯了

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();
}

報(bào)錯信息為:

NullReferenceException was unhandled

Object reference not set to an instance object.

Equals報(bào)錯:NullReferenceException was unhandled
Equals報(bào)錯:NullReferenceException was unhandled

意思是空引用異常未處理;對象引用沒有設(shè)置為對象實(shí)例。

我們該如何分析其原因呢?這就需要理解一下== 運(yùn)算符和 Equals() 方法的區(qū)別了。

== 運(yùn)算符和 Equals() 方法都用于比較兩個(gè)值類型數(shù)據(jù)項(xiàng)或引用類型數(shù)據(jù)項(xiàng)。相等運(yùn)算符 (==) 是比較運(yùn)算符,Equals() 方法比較字符串的內(nèi)容。== 運(yùn)算符比較引用標(biāo)識,而 Equals() 方法只比較內(nèi)容。讓我們看一些例子。

在下面示例中,我們將一個(gè)字符串變量分配給另一個(gè)變量。字符串是引用類型,在示例中,一個(gè)字符串變量被分配給另一個(gè)字符串變量,因此它們在堆中引用相同的標(biāo)識,并且兩者具有相同的內(nèi)容,因此你可以獲得==運(yùn)算符和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)在運(yùn)行程序,得到如圖1.1所示的結(jié)果

  圖1.1 第一個(gè)程序的輸出
圖1.1 第一個(gè)程序的輸出

讓我們看另一個(gè)例子,其中兩個(gè)對象變量的內(nèi)容相同,但都有不同的引用。因此 == 運(yùn)算符返回 false,因?yàn)樗容^引用標(biāo)識,而 Equals() 方法返回 true,因?yàn)樗容^對象的內(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)在運(yùn)行程序,得到如圖1.2 所示的結(jié)果。

圖 1.2 程序 2 的輸出 
圖 1.2 程序 2 的輸出

現(xiàn)在讓我們再回頭看文章開頭的出錯例子,該例子表明當(dāng)你將空值分配給字符串變量并使用該變量時(shí),Equals() 方法是字符串類的擴(kuò)展方法,然后 Equals() 方法獲得空引用的異常,因此在調(diào)用 Equals() 方法時(shí),你必須確保你的變量沒有空值。當(dāng)你的一個(gè)變量包含空值時(shí),你應(yīng)該將該變量用作 Equals() 方法的參數(shù)。

圖 1.3 空引用異常 
圖 1.3 空引用異常

經(jīng)驗(yàn)法則是,對于幾乎所有引用類型,當(dāng)你想要測試相等性而不是引用標(biāo)識時(shí),請使用 Equals,字符串除外;使用 == 比較字符串確實(shí)使事情變得更簡單和更易讀,但你需要記住運(yùn)算符的兩邊必須是字符串類型的表達(dá)式才能使比較正常進(jìn)行。

相關(guān)文章

標(biāo)簽: Equals方法  ==運(yùn)算符  CSharp  
x
  • 站長推薦
/* 左側(cè)顯示文章內(nèi)容目錄 */