2012-02-10 43 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