【问题标题】:In C#, how can a closure reference itself?在 C# 中,闭包如何引用自身?
【发布时间】:2015-11-12 19:14:05
【问题描述】:

在 C# 中,闭包如何引用自身?用例是在单次发生后(或在某些情况下)自动取消订阅事件。我知道你可以创建一个委托的实例,但我真的很想把它作为一个闭包来维护上下文。例如:

var someVar = new FooBar();
textBox1.TextChanged += (s, e) => {
    doSomething(someVar);
    // Unsubscribe from further events
    // textBox1.TextChanged -= myself?
    // If I don't unsubscribe, I'm needlessly keeping reference
    // to someVar, and I don't intend to keep triggering this code
    // upon further events.
};

【问题讨论】:

  • 我相信你必须把doSomething 放在一个实际的事件中,因为你不能用这个删除订阅; textBox1.TextChanged = null。所以你需要一个实际的方法/事件来删除。

标签: c# closures


【解决方案1】:

据我所知,它不能直接引用自己。但是,您可以这样做:

var someVar = new FooBar();
EventHandler closure = null;
closure = (s, e) => {
    doSomething(someVar);
    // Unsubscribe from further events
    // textBox1.TextChanged -= myself?
    // If I don't unsubscribe, I'm needlessly keeping reference
    // to someVar, and I don't intend to keep triggering this code
    // upon further events.
    textBox1.TextChanged -= closure;
};
textBox1.TextChanged += closure;

信用: Can an anonymous method in C# call itself?

【讨论】:

  • 应该是Action<object, TextChangedEventArgs>
  • 其实type应该就是EventHandler
  • TextChangedEventHandler
  • 好点。我展示的是粗略的想法,但我会进行适当的编辑,使其更准确。
  • 似乎 TextChangedEventHandler 是在 PresentationFramework 程序集中定义的。对于这个例子,我将只假设 WinForms 甚至 WebForms。 msdn.microsoft.com/en-us/library/…
猜你喜欢
  • 2012-02-29
  • 1970-01-01
  • 2011-04-17
  • 2021-05-23
  • 1970-01-01
  • 2011-06-22
  • 2016-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多