public void SomeMethod()
{
List<string> someList = LoadList();
if(condition)
{
MethodInvoker invokeThis = delegate {
someList.Remove(0);
};
if(this.InvokeRequired)
{
this.invoke(invokeThis);
}
else
{
invokeThis();
}
}
}
我不明白invokeThis如何获得对someList
的访问权限。不应将范围限制为委托{..};。
答案 0 :(得分:3)
不,访问不应限于delegate { ... }
块。这是匿名函数(匿名方法和lambda表达式)的一大部分好处 - 它们能够捕获局部变量作为其环境的一部分。通过这种方式,他们为C#实现了closures。请注意,这些变量确实是变量 - 如果更改委托中的值,然后再次在方法的其余部分中访问它,您将看到新值。即使在返回方法之后,变量也可以继续存在,并且您甚至可以拥有局部变量的多个“实例” - 每次逻辑执行声明时都会有一个。
有关详情,请参阅C# 4 spec的第7.15.5.1节。
答案 1 :(得分:1)
当你有一个匿名委托或lambda从定义它的函数访问变量时,C#编译器会自动重构你的代码。
具体来说,它生成一个类来保存传递给lambda的方法的locals。如果使用ildasm,Reflector或ILSpy等检查生成的代码,则可以看到这一点。