以下代码来自WPF应用程序中的主窗口:
public MainWindow()
{
...
Storyboard myStoryboard = new Storyboard();
...
_button.Click += delegate(object sender, RoutedEventArgs args)
{
myStoryboard.Begin(_control);
};
...
}
对象myStoryboard
在MainWindow()
内本地定义。然而,按钮单击事件的未命名代理能够访问此对象。这怎么可能?当作为click事件的结果调用委托时,它的运行时环境是什么?
(随Visual Studio 2010提供的C#,.NET 4.0。)
答案 0 :(得分:3)
编译器正在创建一个存储局部变量的额外类型。然后,方法和lambda表达式都使用该额外类型的实例。代码将是这样的:
public MainWindow()
{
CunningCapture capture = new CunningCapture { @this = this };
capture.myStoryboard = new Storyboard();
...
_button.Click += capture.Method;
...
}
private class CunningCapture
{
public Storyboard myStoryboard;
public MainWindow @this;
public void Method()
{
myStoryboard.Begin(@this._control);
}
}