C# 我是否应该检查是否有通过的列表<;T>;是空的

C# 我是否应该检查是否有通过的列表<;T>;是空的,c#,list,null,generic-list,C#,List,Null,Generic List,扩展方法需要一个开放的泛型IEnumerable 我应该在方法内部检查列表是否为空 我的意见是列表不能为空,但计数=0 你如何处理这样的案件 更新: 我忘了提到该方法是一种递归方法,其中列表当然是递归调用/传递的。更新: 我相信您的意思是将列表作为方法参数传递,但在这种情况下,解决方案是显而易见的(甚至检查对象本身): publicstaticvoid扩展方法(此IEnumerable列表, IEnumerable(其他列表) { bool listItselfNotNull=list!=nul

扩展方法需要一个开放的泛型IEnumerable

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

我的意见是列表不能为空,但计数=0

你如何处理这样的案件

更新:

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

更新:

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

publicstaticvoid扩展方法(此IEnumerable列表,
IEnumerable(其他列表)
{
bool listItselfNotNull=list!=null;
bool anOtherListNotNull=anOtherList!=null;
}
视情况而定

如果列表为空是您无法处理的,则测试它并引发
ArgumentNullException

if (list == null)
{
    throw new ArgumentNullException("some suitable message");
}
如果为空的列表等同于现有但没有元素的列表,则允许:

if (list == null || list.Count() == 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];
    }
}
公共静态类框架扩展
{
/// 
///对集合的允许空访问
/// 
///用法:
///foreach(returnArray.AsNotNull()中的int i)
/// {
/////多做点事
/// }
/// 
///收藏类型
/// 
/// 
公共静态IEnumerable AsNotNull(此IEnumerable原件)
{
返回原始??新T[0];
}
}

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

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

    // ...
}
publicstaticvoidmyextension(此IEnumerable源代码)
{
if(source==null)
{
抛出新的ArgumentNullException(“源”);
}
// ...
}
处理空列表比处理空列表实例容易得多。这样想吧;没有项目的列表只是一个空集合——这是很常见的情况。空的列表。。。代表什么?特殊情况,应按此处理

更新:

我环顾四周,看看微软对我的猜测有什么看法,即抛出ANE是一种常见的模式(而不是让CLR抛出NRE——这在某些方面可能过于模糊),这似乎是正确的。我们可以在ANE上发现:

ArgumentNullException(…)的提供使得应用程序代码能够区分由空参数引起的异常和由非空参数引起的异常

稍后,在“框架设计指南”部分:

通过抛出异常来报告执行失败。如果一个成员不能成功地完成它的设计任务,则应将其视为执行失败,并引发异常


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

您可以对空对象调用扩展方法。可以在
null
s上使用扩展方法。哇,很高兴知道,谢谢大家!对于-1,它也值得:)。删除“空提示”我已更新我的问题。如果框架在调用方法时会抛出Null异常,那么为什么要抛出参数异常呢?在ChrisF之前,您建议过ArgumentNullException(他后来编辑了他的解决方案):@Pascal:谢谢。我已经检查了一些设计指南,看起来投掷电子垃圾确实是推荐的模式。请参阅我更新的答案。@Pascal:如果您在整个项目中使用它们,那么它肯定是有意义的(特别是考虑到它们与自动测试或文档生成工具配合得非常好)。这是整个项目的决策(是否使用CC)。将其应用于单个方法/案例可能不是最好的主意。
public static void MyExtension<T>(this IEnumerable<T> source)
{
    if (source == null)
    {
        throw new ArgumentNullException("source");
    }

    // ...
}