2012-03-05 56 views
3

擴展方法需要打開的通用IEnumerable。我是否應該檢查通過的列表<T>是否爲空

我是否應該檢查方法裏面的列表是否爲空。

我認爲一個列表必須不能爲空,但有計數== 0,

你如何處理這種情況?

UPDATE:

我忘了提,該方法是一個遞歸方法,其中列表被遞歸調用/課程的通過。

回答

1

是的,你應該檢查。這也是相當普遍的模式在這種情況下拋出,特別是在LINQ:

public static void MyExtension<T>(this IEnumerable<T> source) 
{ 
    if (source == null) 
    { 
     throw new ArgumentNullException("source"); 
    } 

    // ... 
} 

處理空單比處理列表實例,它是空強多了。以這種方式思考它;沒有物品的列表只是空的收集 - 相當常見的情況。列表是空的...表示什麼? 特殊情況,應該如此處理。

更新:

我環顧四周,什麼微軟不得不說我的猜測是扔ANE是常見的模式(而不是讓CLR拋出NRE - 這在點可能是太模糊),似乎是正確的。我們可以在ANE documentation page發現:

ArgumentNullException(...)設置成應用程序代碼可以分化所造成的空參數,並造成不屬於空參數異常異常之間

,後來在框架設計指南Exception Throwing部分:

確實因拋出異常報告執行失敗。如果一個成員不能成功地做它設計要做的事情,那麼這應該被認爲是執行失敗,應該拋出一個異常

在你的情況,因爲你提到你的方法絕不接受空單的說法,它是簡單執行失敗情況。

+0

我已更新我的問題。爲什麼拋出一個參數異常,如果該框架無論如何會拋出一個空異常,如果該方法被調用? – Pascal 2012-03-05 11:55:06

+0

你在ChrisF之前建議了ArgumentNullException(他稍後編輯了他的解決方案):) – Pascal 2012-03-05 12:52:09

+0

@Pascal:謝謝。我已經檢查了一些設計指南,似乎拋出ANE確實是推薦模式。看到我更新的答案。 – 2012-03-05 17:52:56

-1

更新時間:

我相信你的意思是傳遞一個列表作爲方法的參數,但是在這種情況下的解決方案是顯而易見的(即使檢查對象本身):

public static void ExtensionMethod<T>(this IEnumerable<T> list, 
             IEnumerable<T> anOtherlist) 
{ 
    bool listItselfNotNull = list != null; 
    bool anOtherListNotNull = anOtherList != null; 
} 
+2

您*可以*在空對象上調用擴展方法。 – 2012-03-05 11:43:24

+2

可以在'null'上使用擴展方法。 – Lukazoid 2012-03-05 11:43:37

+1

哇,它真的允許在空值上調用擴展方法:) – 2012-03-05 11:44:42

6

這要看情況。

如果該列表是空的東西,你不能處理然後測試,並提出一個ArgumentNullException

if (list == null) 
{ 
    throw new ArgumentNullException("some suitable message"); 
} 

如果該列表是空等同於現有的但沒有元素則允許列表即:

if (list == null || list.Count() == 0) 
{ 
    ..... 
} 
0

通常我想(使用第三方代碼時ESP),以得到一個異常,但有時處理null作爲一個空的實例更得心應手:

public static class FrameworkExtensions 
{ 
    /// <summary> 
    /// null tolerant access to a Collection 
    /// 
    /// usage: 
    /// foreach (int i in returnArray.AsNotNull()) 
    /// { 
    ///  // do some more stuff 
    /// } 
    /// </summary> 
    /// <typeparam name="T">Type of collection</typeparam> 
    /// <param name="original"></param> 
    /// <returns></returns> 
    public static IEnumerable<T> AsNotNull<T>(this IEnumerable<T> original) 
    { 
     return original ?? new T[0]; 
    } 
}