3

我一直对这个感到困惑。考虑以下循环:

int [] list = new int [] { 1, 2, 3 };  
for (int i=0; i < list.Length; i++) { }  
foreach (int i in list) { }  
while (list.GetEnumerator().MoveNext()) { } // Yes, yes you wouldn't call GetEnumerator with the while. Actually never tried that.  
  • 上面的 [list] 是硬编码的。如果在循环进行迭代时从外部更改列表,会发生什么?
  • 如果 [list] 是只读属性int List{get{return(new int [] {1,2,3});}}怎么办?这会扰乱循环。如果不是,它会在每次迭代中创建一个新实例吗?
4

1 回答 1

6

好:

  • for循环检查list.Length每次迭代;您实际上并未list在循环内访问,因此内容将无关紧要
  • foreach循环仅用于list获取迭代器;将其更改为引用不同的列表不会有任何区别,但是如果您在结构上修改了列表本身(例如,通过添加一个值,如果这确实是 aList<int>而不是 an int[]),那将使迭代器无效
  • 除非列表被清除,否则您编写的第三个示例将永远持续下去,因为它每次都会获得一个新的迭代器。如果您想要更明智的解释,请发布更明智的代码

从根本上讲,您需要了解数组的内容与更改变量所指的对象之间的区别——然后给我们一个非常具体的情况来解释。不过,一般来说,foreach循环只在获取迭代器时直接接触源表达式一次——而for循环没有任何魔力,它的访问频率仅取决于代码——条件和“步骤”部分循环在for每次迭代时执行,所以如果你在这些部分中的任何一个中引用变量,你都会看到任何变化......

于 2012-02-10T19:13:36.523 回答