C#编译器是否能够优化像someEnumerable.Count()这样的语句< 2?

问题描述 投票:0回答:1

假设我有这样的代码:

if (someEnumerable.Count() < 2) {
   // Do something
}

这是否会导致

someEnumerable
被完全迭代,或者如果
Count()
到达可枚举中的第二项,评估就会完成吗?

c# clr compiler-optimization cil
1个回答
0
投票

对于方法的行为没有编译器优化。如果有的话,这将是方法本身的运行时优化。但由于

Enumerable.Count
不知道它在哪个上下文中使用,所以它无法改变它的行为。

如果您不想计数某些东西,而只是想知道是否有不超过一次的用途:

if (!someEnumerable.Skip(1).Any()) {
   // Do something
}

但是,如果

someEnumerable
正在实现
ICollection<TSource>
(如数组、列表或字典),则该方法被优化为仅使用
Count
属性,因此不需要枚举所有项目(source)。那么这将是一个微观优化,会损害代码的可读性。

© www.soinside.com 2019 - 2024. All rights reserved.