2012-02-10 42 views
3

我一直困惑的这一个。考虑以下循环:.NET环路的完整101

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. 
  • [列表]以上是硬编码的。如果在循环迭代过程中列表发生了外部更改,会发生什么情况?
  • 如果什么[名单]是一个只读属性,例如int List{get{return(new int [] {1,2,3});}}?这会扰乱循环。如果不是,它会在每次迭代中创建一个新实例吗?

回答

6

嗯:针对list.Length在每次迭代

  • for循环检查;你实际上并没有在循环内访问list,所以内容将是不相关的
  • foreach循环仅使用list来获得迭代器;如果您在结构上修改列表本身(例如,通过添加一个值,如果这实际上是List<int>而不是int[]),那么将会使迭代器失效
  • 您的第三个假如它每次都会得到一个新的迭代器,除非列表被清除,否则写入的例子将永远持续下去。如果你想要一个更合理的解释,发布更明智的代码

从根本上说,你需要了解的阵列VS改变其对象的变量内容之间的差异是指 - 然后给我们一个非常具体情况解释。虽然在一般,一个foreach仅环直接接触源表达一次,当它取迭代器 - 而for循环有什么神奇的它,以及它如何经常访问只是取决于代码 - 这两个条件与“步”在for循环的一部分,在每个迭代中执行,因此,如果你指的是变量或者那些部分,你会看到任何改变......

+1

的另一点是一个数组,该'Length'属性不可改变的。如果一个调用一个阵列上'Length'并得到一定的价值,将来的所有调用'Length'该阵列是保证返回相同的值。当然,如果一个人有一个数组类型的一个实例变量,并有新的变化该实例变量指向另一个阵列,该阵列的长度可以是从较早的一个不同。 – supercat 2012-02-10 20:56:56