擴展方法需要打開的通用IEnumerable。我是否應該檢查通過的列表<T>是否爲空
我是否應該檢查方法裏面的列表是否爲空。
我認爲一個列表必須不能爲空,但有計數== 0,
你如何處理這種情況?
UPDATE:
我忘了提,該方法是一個遞歸方法,其中列表被遞歸調用/課程的通過。
擴展方法需要打開的通用IEnumerable。我是否應該檢查通過的列表<T>是否爲空
我是否應該檢查方法裏面的列表是否爲空。
我認爲一個列表必須不能爲空,但有計數== 0,
你如何處理這種情況?
UPDATE:
我忘了提,該方法是一個遞歸方法,其中列表被遞歸調用/課程的通過。
是的,你應該檢查。這也是相當普遍的模式在這種情況下拋出,特別是在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部分:
確實因拋出異常報告執行失敗。如果一個成員不能成功地做它設計要做的事情,那麼這應該被認爲是執行失敗,應該拋出一個異常。
在你的情況,因爲你提到你的方法絕不接受空單的說法,它是簡單執行失敗情況。
更新時間:
我相信你的意思是傳遞一個列表作爲方法的參數,但是在這種情況下的解決方案是顯而易見的(即使檢查對象本身):
public static void ExtensionMethod<T>(this IEnumerable<T> list,
IEnumerable<T> anOtherlist)
{
bool listItselfNotNull = list != null;
bool anOtherListNotNull = anOtherList != null;
}
您*可以*在空對象上調用擴展方法。 – 2012-03-05 11:43:24
可以在'null'上使用擴展方法。 – Lukazoid 2012-03-05 11:43:37
哇,它真的允許在空值上調用擴展方法:) – 2012-03-05 11:44:42
這要看情況。
如果該列表是空的東西,你不能處理然後測試,並提出一個ArgumentNullException
:
if (list == null)
{
throw new ArgumentNullException("some suitable message");
}
如果該列表是空等同於現有的但沒有元素則允許列表即:
if (list == null || list.Count() == 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];
}
}
我已更新我的問題。爲什麼拋出一個參數異常,如果該框架無論如何會拋出一個空異常,如果該方法被調用? – Pascal 2012-03-05 11:55:06
你在ChrisF之前建議了ArgumentNullException(他稍後編輯了他的解決方案):) – Pascal 2012-03-05 12:52:09
@Pascal:謝謝。我已經檢查了一些設計指南,似乎拋出ANE確實是推薦模式。看到我更新的答案。 – 2012-03-05 17:52:56