簡體   English   中英

如何在C#中檢測空引用?

[英]How do I detect a null reference in C#?

如何在C#中確定對象引用是否為空?如果它為null,則拋出異常?

即如果我傳入了類引用,我不知道它是否為null。

對null進行測試永遠不會*拋出異常

void DoSomething( MyClass value )
{
    if( value != null )
    {
        value.Method();
    }
}

*絕不應該永遠 正如@Ilya Ryzhenkov指出的那樣,MyClass的!=運算符的錯誤實現可能會引發異常。 幸運的是,Greg Beech有一篇關於在.NET中實現對象相等性的博文。

Robert說的是什么,但是對於那個特例,我喜歡用這樣的保護子句表達它,而不是將整個方法體嵌套在if塊中:

void DoSomething( MyClass value )
{
    if ( value == null ) return;
    // I might throw an ArgumentNullException here, instead

    value.Method();
}

注意,在MyClass上定義運算符!=可能會導致檢查結果不同,以及稍后會發生NullReferenceException。 要絕對確定,請使用object.ReferenceEquals(value,null)

if(p != null)
{
   DoWork(p);
}

此外,如果您想要檢測某個類是否屬於正確類型並且一次性使用它,那么'as'關鍵字會很有用。

IExample e = p as IExample;
if(e != null)
    DoWork(e);

在上面的例子中,如果你要像e(IExample)那樣投射e,如果e沒有實現IExapmle,它將拋出異常。 如果你使用'as'而e沒有實現IExample e將只是null。

如果查看大多數.NET框架源代碼,您會看到他們將這樣的檢查放在其函數的頂部。

public void DoSomething(Object myParam)
{
  if (myParam == null) throw new ArgumentNullException("myParam");

  // Carry on
}

使用C#6.0,這更加優雅; 你可以在一行中做到:-)

value?.Method();

如果“value”為null,則不會發生任何事情 - 也不例外。

這是挑剔,但我總是把它們編碼為......

if (null == obj) {
   obj = new Obj();
}

代替

if (obj == null) {
   obj = new Obj();
}

避免意外寫作

if (obj = null) {
   obj = new Obj();
}

因為

if (null = obj) {
   obj = new Obj();
}

會給你一個編譯錯誤

(YourObject != Null)

你可以比較null嗎?

如果它為null而不是拋出異常,則可以初始化對象。 您可以使用Null Pattern。

或者,如果您使用值類型,則可以閱讀有關可空類型的內容: http//www.c-sharpcorner.com/UploadFile/mosessaur/nullabletypes08222006164135PM/nullabletypes.aspx

我在應用程序的xaml.cs應用程序派生定義中:

private SortedList myList;

我希望能夠重用我的構造函數。 所以我需要:

if ( myList == null)
   myList = new SortedList();

謝謝羅伯特!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM