为求好奇,这里是编译器实际生成当你写代码:
[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