循环声明中的方法执行

Arj*_*Arj 2 c# optimization performance loops

我正在查看我正在开发的网站的性能,我遇到了一些我写的代码:

 foreach (WorkItem wi in p.getWorkItems(dateFrom, dateTo))
 {
     someFunction(wi);
 }
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,p.getWorkItems每次循环执行时该方法都会运行吗?或者它执行一次,将结果对象保存在内存中,只是将指针递增到它正在使用的对象?原因是getWorkItems在幕后做了大量的事情(比较,排序,其他查询),所以最好不要一遍又一遍地执行.如果是这样,那么我最好这样做,如下所示:

 List<WorkItem> workload = p.getWorkItems(dateFrom, dateTo);

 for (int i = 0; i < workload.Count; i++)
 {
     someFunction(workload[i]);
 }
Run Code Online (Sandbox Code Playgroud)

它是用C#编写的,但我假设答案适用于大多数类似的语言.

jas*_*son 5

您应该了解foreach循环如何转换为C#代码.从C#语言规范的8.8.4开始,你的循环

foreach (WorkItem wi in p.getWorkItems(dateFrom, dateTo)) {
   someFunction(wi);
}
Run Code Online (Sandbox Code Playgroud)

变

var enumerator = p.getWorkItems(dateFrom, dateTo).GetEnumerator();
try {
    WorkItem wi;
    while(enumerator.MoveNext()) {
        wi = (WorkItem)enumerator.Current;
        someFunction(wi);
    }
}
finally {
    IDisposable disposable = enumerator as System.IDisposable;
    if (disposable != null) disposable.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

因此,CLEAR只p.getWorkItems执行一次.