爲求好奇,這裏是編譯器實際生成當你寫代碼:
[System.Runtime.CompilerServices.CompilerGenerated]
private sealed class AnomClass
{
public int i;
public int CalcSquaresSum_AnonFunc() {
return (this.i * this.i);
}
}
public int CalcSquaresSum()
{
int sumOfSquares = 0;
List<Func<int>> functions = new List<Func<int>>();
AnomClass anonObj = new AnomClass();
Func<int> anonFunc = null;
for (anonObj.i = 1; anonObj.i <= 10; anonObj.i++) {
if (anonFunc == null)
anonFunc = new Func<int>(anonObj.CalcSquaresSum_AnonFunc);
functions.Add(anonFunc);
}
foreach (Func<int> function in functions) {
sumOfSquares += function();
}
return sumOfSquares;
}
正如你所看到的,有沒有涉及魔法。匿名方法只能訪問在其範圍之外聲明的變量,因爲它沒有在其範圍之外真正聲明。
真的會發生什麼是變量i
管S移到一個無形的類。匿名方法駐留在該類上。從那裏它可以直接訪問i
。在CalcSquaresSum
方法內部,對i
的引用都被翻譯爲對不可見類的引用。
注意,變量sumOfSquares
接收相同的處理。當然,發生這種情況是因爲編譯器足夠聰明,意識到只有i
被匿名方法使用。
爲什麼不啓動Reflector並查看編譯器爲您生成了什麼? – 2009-09-05 07:53:51