我不會問這個問題什麼是關閉。這是一個封閉: 如:C#,Closures和Lambdas
List<Func<int>> add = new List<Func<int>>();
List<int> coll = new List<int>(){1,2,3,4,5};
foreach (int i in coll)
{
add.Add(() => i*2);
}
由於關閉關閉了變數,毫無疑問其結果將適用於所有情況是10,如果我們試圖調用的「添加」列表中的所有函數功能。這讓我想,如果這是封閉的,那麼下面的例子也應該是封閉的。
//Indirect way of writing the same example
Enumerable.Range(1, 5).ToList().ForEach(x => add.Add(() => x * 2));
這裏也是我們在關閉的變量,因此該變量的狀態應該是變量的最後一個值,但事實證明,事實並非如此。這不是關閉。 lambda是否以不可改變的方式構造其變量,即一旦我們更改x的值,就會創建一個新變量來存儲該值?
請記住,變量是*存儲位置*。你不會指望在lambda的兩個不同的調用中將相同的存儲位置用於形式參數x,因爲對應於x的兩個參數可能在同一時間是不同的*。調用方法爲形式參數和當地人創建新的存儲位置;這些存儲位置都包含在封口中。現在,第一個示例中的「我」只有一個存儲位置。 (我們可能會在下一個版本中改變這種情況,因爲這是一個常見錯誤。) –
我想知道這仍然會被問到多少次...... – leppie