我能在C++/CX中使用lambda处理事件吗?

9

在C++/CX中是否可以使用lambda处理事件?例如,如何将以下C#代码片段转换为最佳的C++/CX代码?

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

6

是的,那是正确的语法。然而,我们建议您使用功能处理程序而不是lambda,因为lambda可能会引入循环引用并防止内存被释放。

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

一般来说,除非您特别注意避免循环引用,否则最好使用命名函数而不是lambda作为事件处理程序。命名函数通过弱引用捕获“this”指针,而lambda则通过强引用捕获它并创建一个循环引用。有关更多信息,请参阅弱引用和断开循环(C++/CX)。


5

这是我最终采取的做法。

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

如果我理解ThomasP的话,这样会通过强引用来捕获它,从而创建一个潜在的内存泄漏循环引用。http://msdn.microsoft.com/en-US/library/windows/apps/hh699859.aspx似乎暗示你应该使用WeakReference来捕获它? - Just another metaprogrammer
很遗憾,事件使用强引用。我什么时候想让事件保持对象的生命?这是我对C#的少数抱怨之一。 - Andrew Garrison
我持有同样的观点,我怀疑这就是为什么他们在WPF中引入了IWeakEventListener。不过它有些笨重。(在我看来,他们也应该使空值不安全) - Just another metaprogrammer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接