【发布时间】:2014-09-08 12:18:04
【问题描述】:
关于实现this[int] 的集合和假设集合在枚举期间不会改变,foreach (var item in list) 循环是否会在任何时候产生与for (var i = 0; i < list.Count; ++i) 相同的序列?
这意味着,当我需要按索引升序时,我可以使用foreach 还是更安全地使用for?或者它只是取决于当前的集合实现并且可能会随时间变化或变化?
【问题讨论】:
-
通常
foreach基于GetEnumerator方法(有时在数组上除外)。 -
如果您需要知道索引,请使用
for否则,您的选择 -
@PatrickHofman
++i也很常见,尤其是对于 C++ 程序员。如果i是复杂类型,它可以产生更好的性能。 -
@Sayse
i++修改变量但返回原始值。所以它需要创建一个副本。如果无法优化该副本,则会降低性能。对于整数,任何体面的编译器都会对其进行优化,但在 C++ 中,通常会使用更复杂的迭代器,而编译器可能无法做到这一点。在 C# 中,这无关紧要,因为你不能直接重载i++或++i,你只能重载一个共享增量函数。 -
@Sayse 也有人问过here。
标签: c# foreach enumeration ilist