MethodInvoker如何访问其范围之外的成员?

时间:2011-06-21 16:09:36

标签: c# .net

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的访问权限。不应将范围限制为委托{..};。

2 个答案:

答案 0 :(得分:3)

不,访问不应限于delegate { ... }块。这是匿名函数(匿名方法和lambda表达式)的一大部分好处 - 它们能够捕获局部变量作为其环境的一部分。通过这种方式,他们为C#实现了closures。请注意,这些变量确实是变量 - 如果更改委托中的值,然后再次在方法的其余部分中访问它,您将看到新值。即使在返回方法之后,变量也可以继续存在,并且您甚至可以拥有局部变量的多个“实例” - 每次逻辑执行声明时都会有一个。

有关详情,请参阅C# 4 spec的第7.15.5.1节。

答案 1 :(得分:1)

当你有一个匿名委托或lambda从定义它的函数访问变量时,C#编译器会自动重构你的代码。

具体来说,它生成一个类来保存传递给lambda的方法的locals。如果使用ildasm,Reflector或ILSpy等检查生成的代码,则可以看到这一点。