闭包:将一个字段分配给本地捕获哪个值?

时间:2014-03-06 16:53:53

标签: c# lambda closures

我在课堂上有以下模式:

Foo m_currentFoo;

void ReplaceFooWithDelayedDestruction() {
    Dispatcher.BeginInvoke(() => {
        var oldFoo = m_currentFoo;
        Destroy(oldFoo);
    }
    m_currentFoo = new Foo();
}

我的问题是,当执行lambda时(可能是在ReplaceFoo ...返回后),oldFoo实际上会引用在BeginInvoke上传递的值,还是m_currentFoo的新值?

1 个答案:

答案 0 :(得分:1)

要在被覆盖之前正确捕获当前的foo,你应该在你的封闭函数中使用一个局部变量,否则你冒着让你的旧foo徘徊而不是破坏你新创建的foo的风险。

Foo m_currentFoo;

void ReplaceFooWithDelayedDestruction()
{
    var oldFoo = m_currentFoo;

    Dispatcher.BeginInvoke(() => { Destroy(oldFoo); } );

    m_currentFoo = new Foo();
}