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

C# 闭包:将字段分配给本地捕获哪个值?,c#,lambda,closures,C#,Lambda,Closures,我在课堂上有以下模式: Foo m_currentFoo; void ReplaceFooWithDelayedDestruction() { Dispatcher.BeginInvoke(() => { var oldFoo = m_currentFoo; Destroy(oldFoo); } m_currentFoo = new Foo(); } 我的问题是,当lambda被执行时(大概是在ReplaceFoo…返回之后),o

我在课堂上有以下模式:

Foo m_currentFoo;

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

我的问题是,当lambda被执行时(大概是在ReplaceFoo…返回之后),oldFoo实际上是指在BeginInvoke上传入的值,还是指m_currentFoo的新值?

要在覆盖当前foo之前正确捕获它,应该在封闭函数中使用局部变量,否则,您将面临旧foo挂起的风险,而不是销毁新创建的foo

Foo m_currentFoo;

void ReplaceFooWithDelayedDestruction()
{
    var oldFoo = m_currentFoo;

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

    m_currentFoo = new Foo();
}

你实际上是在捕捉这个。啊,没错,我不知道本地人要去哪里。这完全有道理。