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
的。不应该将范围限制为委托{..};。
否,访问不应仅限于delegate { ... }
块。这是匿名函数(匿名方法和lambda表达式(的很大一部分好处——它们能够捕获局部变量,将其作为环境的一部分。通过这种方式,他们为C#实现了闭包。请注意,这些实际上是变量——如果您更改委托中的值,然后在方法的其余部分中再次访问它,您将看到新值。即使在方法返回后,变量也可以继续存在,甚至可以拥有一个局部变量的多个"实例"——每次逻辑执行声明时都有一个。
有关更多详细信息,请参见C#4规范的7.15.5.1节。
当您有一个匿名委托或lambda访问定义它的函数中的变量时,C#编译器会自动重组您的代码。
具体来说,它生成一个类来保存传递给lambda的方法的局部变量。如果您使用ildasm、Reflector或ILSpy之类的工具检查生成的代码,您可以看到这一点。