我是否应该检查通过的列表<;T>;为null

本文关键字:lt gt null 列表 是否 检查 | 更新日期: 2023-09-27 18:26:48

扩展方法需要一个开放的通用IEnumerable。

我应该在方法内部检查列表是否为空。

我的观点是,列表永远不能为空,但计数==0。

你是如何处理这样的案件的?

更新:

我忘了提到这个方法是一个递归方法,其中列表当然是递归调用/传递的。

我是否应该检查通过的列表<;T>;为null

这取决于情况。

如果列表为空是你无法处理的,那么测试它并引发一个ArgumentNullException:

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

如果列表为空相当于现有但没有元素的列表,则允许:

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

是的,您应该检查一下。在这种情况下,抛出这种模式也是相当常见的,尤其是在LINQ:中

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

处理空列表比处理为null的列表实例要容易得多。这样想吧;并没有项目的列表只是一个空集合——这种情况很常见。列表为空。。。代表什么特殊情况,应按此处理。

更新:

我四处查看了微软对我的猜测的看法,即抛出ANE是一种常见的模式(而不是让CLR抛出NRE——这在某些方面可能太模糊了),这似乎是正确的。我们可以在ANE文档页面上找到:

提供ArgumentNullException(…)是为了使应用程序代码能够区分由null参数引起的异常和由非null参数造成的异常。

稍后,在框架设计指南的异常抛出部分:

请通过抛出异常来报告执行失败。如果成员无法成功完成其设计任务,则应将其视为执行失败,并应抛出异常

在您的情况下,由于您提到您的方法决不能接受null列表参数,因此这是一个简单的执行失败的情况。

通常我想得到一个异常,但有时(尤其是在使用第三方代码时)将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];
    }
}

更新:

我相信您的意思是将列表作为方法参数传递,但在这种情况下,解决方案是显而易见的(甚至检查对象本身):

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