扩展方法需要一个开放的通用IEnumerable。
我应该在方法内检查列表是否为空。
我认为列表必须永远不能为null,但要计数== 0。
你如何处理这种情况?
更新:
我忘了提到该方法是一种递归方法,其中列表是递归调用/传递的。
答案 0 :(得分:6)
取决于。
如果列表为null是您无法处理的,那么请测试它并引发ArgumentNullException
:
if (list == null)
{
throw new ArgumentNullException("some suitable message");
}
如果列表为null与现有列表相同但没有元素,则允许:
if (list == null || list.Count() == 0)
{
.....
}
答案 1 :(得分:1)
是的你应该检查一下。抛出这种情况也是相当普遍的模式,特别是在LINQ中:
public static void MyExtension<T>(this IEnumerable<T> source)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
// ...
}
处理空列表比处理null的列表实例容易得多。以这种方式思考它;没有项目的列表只是空集合 - 相当常见的情况。列表为null ...代表什么? 特殊情况,应该按原样处理。
<强>更新强>
我看了一下微软对我的猜测所说的内容,即抛出ANE是一种常见的模式(而不是让CLR抛出NRE - 而这一点可能过于含糊)并且看起来是正确的。我们可以在ANE documentation page找到:
提供了ArgumentNullException(...),以便应用程序代码可以区分由空参数引起的异常和非空参数引起的异常。
之后,在框架设计指南中Exception Throwing部分:
通过抛出异常来报告执行失败。如果某个成员无法成功完成它的设计,那么应该将其视为执行失败并抛出异常。
在您的情况下,由于您提到您的方法必须永远不接受空列表参数,因此它是简单的执行失败情况。
答案 2 :(得分:0)
通常我想得到一个异常,但有时(尤其是在使用第三方代码时)处理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];
}
}
答案 3 :(得分:-1)
更新:
我相信你的意思是将列表作为方法参数传递,但在这种情况下解决方案很明显(甚至检查对象本身):
public static void ExtensionMethod<T>(this IEnumerable<T> list,
IEnumerable<T> anOtherlist)
{
bool listItselfNotNull = list != null;
bool anOtherListNotNull = anOtherList != null;
}