我正在查看我正在开发的网站的性能,并且我遇到了一些我写的代码:
foreach (WorkItem wi in p.getWorkItems(dateFrom, dateTo))
{
someFunction(wi);
}
在上面的代码中,每次循环执行时p.getWorkItems
方法都会运行吗?或者它执行一次,将结果对象保存在内存中,只是将指针递增到它正在使用的对象?原因是getWorkItems
在幕后做了大量的事情(比较,排序,其他查询),所以最好不要一遍又一遍地执行。如果是这样,那么我最好这样做,如下所示:
List<WorkItem> workload = p.getWorkItems(dateFrom, dateTo);
for (int i = 0; i < workload.Count; i++)
{
someFunction(workload[i]);
}
它是用C#编写的,但我假设答案适用于大多数类似的语言..
答案 0 :(得分:5)
您应该了解如何将foreach
循环转换为C#代码。从C#语言规范的8.8.4开始,你的循环
foreach (WorkItem wi in p.getWorkItems(dateFrom, dateTo)) {
someFunction(wi);
}
变为
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();
}
因此,p.getWorkItems
只执行一次是明确的。
答案 1 :(得分:1)
或者它执行一次,将结果对象保存在内存中,只是将指针递增到它正在使用的对象?
是。(*)您可以通过在getWorkItems
中添加打印声明来证明这一点。
(*)除非结果对象以递归方式调用getWorkItems
。
答案 2 :(得分:1)
p.getWorkItems
只被调用一次。结果存储在内存中,foreach循环在内存中迭代结果对象。
如果不是这种情况,则每次该方法返回新列表时,foreach将永远不会结束。
答案 3 :(得分:0)
一个小的证明申请:
Put me with a previous value