2012-03-05 74 views
0

讓我們假設我寫在C#中的公共API:可空參數檢查

public void Method(object param) 
{ 
    if(param == null) 
    { 
     throw new ArgumentNullException("Specified 'param' can not be null"); 
    } 

// ... other business logic 
} 

我不知道有沒有,我並不需要檢查參數值,如果我有不能爲空參數任何保證( object?param)作爲方法參數?換句話說就是上面的例子檢查null多餘?

+0

請不要用「C#」等標題加前綴。這就是標籤的用途。 – 2012-03-05 18:19:35

+1

除此之外:您可能想要使用帶有兩個'string'參數的'ArgumentNullException'構造函數:'paramName'和'message'。 – HABO 2012-03-05 18:22:24

回答

1

不,引用類型總是可爲空的。試試吧:撥打Method(null);,你會得到一個運行時間ArgumentNullException,你正是把它放在代碼中的地方。您不會收到編譯器錯誤,因爲null是引用類型的有效值。

對於價值類型,這是一個不同的故事。如果您有int類型的參數,則它不能爲空。實際上,編譯器甚至不會接受if (i == null)

1

如果您的參數輸入爲參考類型,則始終可以將null作爲值傳遞。因此,這種檢查,當只考慮Method從來沒有多餘。

有可能對給定方法的上下文特定分析證明null從不使用。例如

sealed class Example { 
    void Method(object p) { 
    ... 
    } 
    void Other() { 
    Method("hello"); 
    } 
} 

在這個特定背景,你可以證明Method永遠不能用一個null值(不包括基於當然反射調用的)調用。但是這種類型的確定只能通過具體情況分析來完成

0

如果這是多餘的,不能在這個單一方法的範圍內定義,而是在程序的域中定義。這個方法用在哪裏?它起什麼作用?在程序發生故障時應該發生什麼

回答這個問題你會發現自己回答自己的問題。

0

它不是多餘的,因爲object類型的變量可以設置爲空,因爲它是一個引用類型。 object?類型不存在。