2013-02-26 80 views
1

假設我有一個具有複雜屬性BarFoo類。然後,假設我有一些其他類類似下面的方法:訪問參數屬性時使用ArgumentNullException

public void DoSomething(Foo foo) 
{ 
    if (foo == null) 
     throw new ArgumentNullException("foo"); 
    if (foo.Bar == null) 
     throw new ArgumentNullException("bar"); 
} 

是使用ArgumentNullException適當這裏雖然嚴格來說,foo.Bar是不是在這種情況下的說法? I have read,並且可以理解,手動拋出NullReferenceException是不合適的。這是否告訴我我需要抽象?

public void DoSomething(Foo foo) 
{ 
    if (foo == null) 
     throw new ArgumentNullException("foo"); 
    DoSomethingElse(foo.Bar); 
} 

private void DoSomethingElse(Bar bar) 
{ 
    if (bar == null) 
     throw new ArgumentNullException("bar"); 
} 

我的第一個代碼段是ArgumentNullException的「正確」用法嗎?處理這種情況的傳統方式是什麼?

謝謝。

+1

當它不是'Foo'的有效實例(例如它的一個屬性爲null)時,你可以拋出'new ArgumentException(「foo」)' – MarcinJuraszek 2013-02-26 21:09:43

+1

當你拋出一個'ArgumentException'時,字符串構造函數需要一個消息['new ArgumentException(string message)'](http://msdn.microsoft.com/zh-cn/library/wtxc6334.aspx)。如果您要指定參數名稱,請使用['new ArgumentException(string message,string paramName)'](http://msdn.microsoft.com/zh-cn/library/sxykka64.aspx)。 – 2013-02-26 21:16:42

回答

9

理想情況下,Foo類將確保其Bar屬性永遠不爲null。如果這是不可能的,我會在這種情況下拋出ArgumentException,因爲參數不是null,但它是無效的。

+1

假設它對'Foo.Bar'有效,但是'DoSomething'特別需要'foo.Bar'有一個值,你會建議'DoSomething'應該總是用默認執行路徑處理這個一個默認值,如果適用的話)根本不會拋出異常? – 2013-02-26 21:24:30

+0

@AntP - 這取決於DoSomething的功能。如果它返回一個默認值是有效的,那麼這可能會更好,但我會拋出一個異常,而不是像null或-1那樣返回一些'特殊'返回值。 – Lee 2013-02-26 21:34:14