.NET循环完整性101

时间:2012-02-10 19:08:18

标签: c# loops ienumerable integrity

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

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});}}?这会扰乱循环吗?如果没有,它会在每次迭代中创建一个新实例吗?

1 个答案:

答案 0 :(得分:6)

好:

  • for循环在每次迭代时检查list.Length;你实际上并没有在循环中访问list,所以内容将是无关紧要的
  • foreach循环仅使用list来获取迭代器;将其更改为引用不同的列表没有区别,但如果您在结构上修改了列表本身(例如,通过添加值,如果这实际上是List<int>而不是int[]),那就会使迭代器无效
  • 你写的第三个例子将永远存在,除非列表被清除,因为它每次都会得到一个新的迭代器。如果您想要更明智的解释,请发布更明智的代码

从根本上说,您需要了解数组内容与更改变量引用的对象之间的区别 - 然后给出一个非常具体的情况来解释。一般来说,foreach循环只有在获取迭代器时才直接触及源表达式 - 而for循环中没有魔法,并且它访问的频率只取决于关于代码 - 条件和&#34;步骤&#34; for循环的一部分在每次迭代时执行,因此如果您在其中任何一个部分中引用该变量,您将看到任何更改......