在运行时,C#如何委托定义它的访问范围?

时间:2014-11-14 11:07:19

标签: c# delegates

以下代码来自WPF应用程序中的主窗口:

public MainWindow()
{
    ...
    Storyboard myStoryboard = new Storyboard();
    ...

    _button.Click += delegate(object sender, RoutedEventArgs args)
    {
        myStoryboard.Begin(_control);
    };
    ...
}

对象myStoryboardMainWindow()内本地定义。然而,按钮单击事件的未命名代理能够访问此对象。这怎么可能?当作为click事件的结果调用委托时,它的运行时环境是什么?

(随Visual Studio 2010提供的C#,.NET 4.0。)

1 个答案:

答案 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);
    }
}