【发布时间】:2011-08-30 13:44:33
【问题描述】:
已经有question on SO about "possible multiple enumerations",但这个问题更具体。
请考虑以下方法,该方法将IEnumerable<string> 作为输入并针对其每个元素执行给定的方法:
public static bool SomeMethod(IEnumerable<string> enumerable)
{
if (enumerable.IsNullOrEmpty())
{
// throw exception.
}
else
{
return (enumerable.All(SomeBooleanMethod));
}
}
在上面的代码中,IsNullOrEmpty 只是一个运行的扩展方法
return (!ReferenceEquals(enumerable, null) || enumerable.Any());
问题是 ReSharper 警告我“可能有多个 IEnumerable 枚举”,我真的不知道这是否真的是一个问题。
我理解警告的含义,但是如果你真的需要检查并抛出异常以防 null 或 empty,你能做些什么呢?
【问题讨论】:
-
如果传递一个空序列,为什么要让这个方法抛出? “对这个(空)序列的每个成员做某事”的语义非常明显,不是吗?另外,您使用
ReferenceEquals()而不仅仅是== null有什么特别的原因吗? -
确实不是,但现在想象这是一个构造函数。如果我不能从一个空序列构造一个对象,我不应该抛出异常吗?
-
当然,如果你真的无能为力;但一般我会说空序列应该被视为与任何非空序列一样好。例如,
List<>非常乐意从空序列构造。当然,我只是泛泛而谈;你知道你的情况的细节。
标签: c# resharper ienumerable