【问题标题】:Does Any() extension method handle null values?Any() 扩展方法是否处理空值?
【发布时间】:2016-07-01 10:51:03
【问题描述】:

在下面的程序中,(!testlist.Any()) 抛出一个参数空异常。 Any() 扩展方法默认不处理空值吗?

什么是正确的方法?当List<int> 用作方法中的参数时,是否应该在 Any() 之前添加空检查?

public class Program
    {
        public static void Main(string[] args)
        {

            Console.WriteLine("Hello, world!");

            foo(null);
         }

        public static void foo(List<int> testlist)
        {
            if (!testlist.Any())
            {
                Console.WriteLine("testlist is empty!");
            }
        }
    }

【问题讨论】:

  • if (!testList?.Any() ?? false) { doStuff(testList); } 除非你想重新抛出异常。
  • 它通过抛出异常来“处理”集合的空值。
  • 如果source or predicate is null 则抛出ArgumentNullException
  • 如果我有时间,我会写一个冗长的答案,解释答案取决于你的方法的合同,解释什么是合同以及它为什么重要。 SO上有很多这样的答案-也许有人想找到并链接到一个?

标签: c# .net list int extension-methods


【解决方案1】:

使用List作为Any()之前是否应该加一个空检查 方法中的参数?

是的,这是正确的方法。该方法应该快速失败并显示有意义的消息。

public static void foo(List<int> testlist)
{
    if(testlist == null) 
        throw new ArgumentNullException(nameof(testlist), $"{nameof(testlist)} must not be null");
    if (!testlist.Any())
    {
        Console.WriteLine("testlist is empty!");
    }
}

当然Enumerable.Any 不会为您处理这个问题。 null 被传递给此方法可能是一个错误,或者它可能是一个可行的选项。 只有你知道

例外也是documented

ArgumentNullException: 来源为空。”

如果你不想抛出但又想接受null,就处理这种情况:

if(testlist == null || !testlist.Any()) 
{ 
    Console.WriteLine("testlist is null or empty!");
}
else ....

【讨论】:

  • 或者,如果该方法的合同说空的testList 是可以的,那么它根本不会失败。我认为这不是一个好的解决方案,但 OP 处于这种情况可能是有原因的。
  • 使用此方法的用户不是技术人员。他们可能仍会传递空值,并且在这种情况下,该方法可能会返回“emptylist”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多