Csharp/C#教程:甚至“IsNullOrEmpty”检查也会给出“可能多次枚举IEnumerable”的警告分享


甚至“IsNullOrEmpty”检查也会给出“可能多次枚举IEnumerable”的警告

关于“可能存在多个枚举”的SO有一个问题 ,但这个问题更具体。

请考虑以下方法,该方法将IEnumerable作为输入并对其每个元素执行给定方法:

 public static bool SomeMethod(IEnumerable enumerable) { if (enumerable.IsNullOrEmpty()) { // throw exception. } else { return (enumerable.All(SomeBooleanMethod)); } } 

在上面的代码中, IsNullOrEmpty只是一个运行的扩展方法

 return (!ReferenceEquals(enumerable, null) || enumerable.Any()); 

问题是ReSharper警告我“IEnumerable的可能的多个枚举”,我真的不知道这是否真的是一个问题。

我理解警告的含义,但是如果你确实需要在无效或空洞的情况下检查并抛出exception,那么在这种情况下你真的能做些什么呢?

这意味着你(部分地)在IEnumerable上多次迭代:首先在你对Any()调用中(它需要至少初始化迭代以查看枚举是否返回任何元素),以及第二次在All (从头开始迭代)。

ReSharper对此提出警告的原因是,对可枚举的枚举可能会导致副作用,无意中迭代两次可能会触发两次副作用,这可能是也可能不是。

正如@tdammers所指出的那样,所提到的“多个枚举”是AnyAll所需的两个枚举。 既然你想拒绝一个空序列,我能想到的最好的是:

上述就是C#学习教程:甚至“IsNullOrEmpty”检查也会给出“可能多次枚举IEnumerable”的警告分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

 public static bool SomeMethod(IEnumerable enumerable) { if (enumerable == null) throw new ArgumentNullException(); // Manually perform an All, keeping track of if there are any elements bool anyElements = false; bool result = true; foreach (string item in enumerable) { anyElements = true; result = result && SomeBooleanMethod(item); // Can short-circuit here if (!result) break; } if (!anyElements) throw new ArgumentException(); // Empty sequence is invalid argument return result; } 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/985148.html

(0)
上一篇 2021年12月21日
下一篇 2021年12月21日

精彩推荐