【问题标题】:Closures: assigning a field to a local captures which value?闭包:将字段分配给本地捕获哪个值?
【发布时间】:2014-03-06 16:53:52
【问题描述】:

我在课堂上有以下模式:

Foo m_currentFoo;

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

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

【问题讨论】:

  • 你实际上是在捕获this

标签: c# lambda closures


【解决方案1】:

要在当前 foo 被覆盖之前正确捕获它,您应该在封闭函数中使用局部变量,否则您将冒着让旧 foo 闲置并破坏新创建的 foo 的风险。

Foo m_currentFoo;

void ReplaceFooWithDelayedDestruction()
{
    var oldFoo = m_currentFoo;

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

    m_currentFoo = new Foo();
}

【讨论】:

  • 啊,没错,我对当地人必须去哪里感到困惑。这完全有道理。
猜你喜欢
  • 2015-11-13
  • 1970-01-01
  • 2018-02-23
  • 1970-01-01
  • 2017-04-10
  • 2019-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多