【问题标题】:Can I handle an event with a lambda in C++/CX?我可以在 C++/CX 中使用 lambda 处理事件吗?
【发布时间】:2012-09-10 20:14:43
【问题描述】:

是否可以在 C++/CX 中使用 lambda 处理事件?例如,将这段 sn-p 代码从 C# 转换为 C++/CX 的最佳方法是什么?

this.animation.Completed += (s, e) =>
{
   animation.Begin();
};

【问题讨论】:

    标签: event-handling lambda c++-cx


    【解决方案1】:

    是的,这是正确的语法。但是,我们建议您使用函数处理程序而不是 lambda,因为 lambda 会引入循环引用并阻止内存被释放。

    http://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh755799.aspx

    一般来说,最好使用命名函数,而不是 lambda, 对于事件处理程序,除非您非常注意避免循环 参考。命名函数通过弱捕获“this”指针 引用,而 lambda 通过强引用捕获它,并且 创建循环引用。有关详细信息,请参阅弱 引用和中断循环 (C++/CX)。

    【讨论】:

      【解决方案2】:

      这就是我最终做的事情。

      animation->Completed += ref new EventHandler<Object^>([this](Object^, Object^)
      {
         animtion->Begin();
      });
      

      【讨论】:

      • 如果我理解上面的 ThomasP 不会通过强 ref 捕获这一点,从而创建一个循环引用,从而产生潜在的内存泄漏。 msdn.microsoft.com/en-US/library/windows/apps/hh699859.aspx 似乎暗示您应该使用 Wea​​kReference 来捕获它?
      • 不幸的是,事件使用强引用。我什么时候想要一个事件来保持对象活着?这是我对 C# 的少数抱怨之一。
      • 我的观点相同,我怀疑这就是他们在 WPF 中引入 IWeakEventListener 的原因。虽然很笨拙。 (他们也应该使空值不安全恕我直言)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-14
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 2016-01-05
      • 1970-01-01
      相关资源
      最近更新 更多