MethodInvoker如何访问其作用域之外的成员

本文关键字:作用域 成员 何访问 访问 MethodInvoker | 更新日期: 2023-09-27 17:59:57

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

MethodInvoker如何访问其作用域之外的成员

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

有关更多详细信息,请参见C#4规范的7.15.5.1节。

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

具体来说,它生成一个类来保存传递给lambda的方法的局部变量。如果您使用ildasm、Reflector或ILSpy之类的工具检查生成的代码,您可以看到这一点。