在C#中是每次评估的循环声明吗?

use*_*831 1 c# evaluation loops for-loop conditional-statements

这是一个非常挑剔的问题,但好奇心让我变得更好.

每次循环执行时,for循环是否重新评估RHS条件?见下文.

for(int i = 0; i < collection.Count; i++)
{
}
Run Code Online (Sandbox Code Playgroud)

在整个代码库中执行以下操作是否良好?

for(int i = 0, n = collections.Count; i < n; i++)
{
}
Run Code Online (Sandbox Code Playgroud)

或者编译器是否进行了这些优化/它们可以忽略不计(即使有庞大的代码库)?

Aas*_*set 9

在每次迭代之前重新评估条件(除非编译器检测到条件是常量),并且可以编写依赖于此的代码(例如调用每次返回值不同的函数).因此,如果您的评估条件很昂贵并且您确定它将保持不变,那么在循环之前对它进行一次评估确实是一个好主意.但是,对于大多数标准集合类型而言,Count如此快速的操作使得可忽略的性能增益不值得降低可读性.