我是否应该检查通过的列表<;T>;为null
本文关键字:lt gt null 列表 是否 检查 | 更新日期: 2023-09-27 18:26:48
扩展方法需要一个开放的通用IEnumerable。
我应该在方法内部检查列表是否为空。
我的观点是,列表永远不能为空,但计数==0。
你是如何处理这样的案件的?
更新:
我忘了提到这个方法是一个递归方法,其中列表当然是递归调用/传递的。
这取决于情况。
如果列表为空是你无法处理的,那么测试它并引发一个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;
}