gpt4 book ai didi

c# - foreach 和 classic for 一样吗?

转载 作者:行者123 更新时间:2023-11-30 20:47:34 25 4
gpt4 key购买 nike

关于实现 this[int] 的集合并且假设集合在枚举期间不会改变foreach (var item in list)循环产生与 for (var i = 0; i < list.Count; ++i) 相同的序列随时?

这意味着,当我需要按索引升序排列时,我可以使用 foreach 吗?或者只是更安全地使用 for ?或者它仅取决于当前的集合实现并且可能会随时间变化或变化?

最佳答案

foreach (var item in list)
{
// do things
}

翻译成

var enumerator = list.GetEnumerator();
while(enumerator.MoveNext())
{
var item = enumerator.Current;
// do things
}

如您所见,它没有使用索引器 list[i]在一般情况下。然而,对于大多数集合类型,语义是相同的。

编辑

IList<T>在枚举器 IList 作为链表的实现中,您不太可能在枚举器实现中使用索引器,因为它的效率非常低。根据经验,使用 foreach确保您为手头的类(class)使用最有效的算法,因为它是由类(class)的创建者选择的。在最坏的情况下,您只会遭受不太可能引人注意的小间接开销。

在nos的评论后编辑2

有一种情况,两种构造的语义差异很大:集合修改。

虽然使用了一个简单的 for循环,如果您在遍历集合时更改集合,则不会发生任何特别的事情。该程序的行为就好像它假设您知道自己在做什么一样。这可能会导致某些值重复多次或跳过其他值,但只要您不访问索引器范围之外的值(这将需要多线程程序才能发生),也不异常(exception)。

同时使用 foreach环形;如果在遍历集合时修改集合,则会输入未定义的行为。 documentation告诉我们

An enumerator remains valid as long as the collection remains unchanged. If changes are made to the collection, such as adding, modifying, or deleting elements, the enumerator is irrecoverably invalidated and its behavior is undefined. In that case, expect most of C# built-in types to throw an InvalidOperationException, but everything can happen in a custom implementation, from missed values to repeated values , including infinite loops...

关于c# - foreach 和 classic for 一样吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25724100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com