是否可以使用C++/CX中的lambda處理事件?舉個例子,將這段代碼從C#轉換爲C++/CX的最好方法是什麼?我可以使用C++/CX中的lambda處理事件嗎?
this.animation.Completed += (s, e) =>
{
animation.Begin();
};
是否可以使用C++/CX中的lambda處理事件?舉個例子,將這段代碼從C#轉換爲C++/CX的最好方法是什麼?我可以使用C++/CX中的lambda處理事件嗎?
this.animation.Completed += (s, e) =>
{
animation.Begin();
};
是的,這是正確的語法。但是,我們建議您使用函數處理函數而不是lambda函數,因爲lambda函數可以引入循環引用並防止釋放內存。
http://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh755799.aspx
一般來說,它的更好,除非你採取非常謹慎,以避免循環 引用使用命名功能,而不是拉姆達 的事件處理程序。一個命名的函數通過弱的 引用捕獲「this」指針,而lambda通過強引用捕獲它,並且 創建一個循環引用。有關更多信息,請參閱弱 引用和中斷週期(C++/CX)。
這就是我最終做的。
animation->Completed += ref new EventHandler<Object^>([this](Object^, Object^)
{
animtion->Begin();
});
如果我理解ThomasP以上也不會被強REF捕獲此,並因此產生一個循環引用創建潛在內存泄漏。 http://msdn.microsoft.com/en-US/library/windows/apps/hh699859.aspx似乎暗示你應該使用WeakReference捕獲這個? – FuleSnabel
不幸的是,事件使用強烈的參考。我什麼時候需要一個事件來保持對象的活性?這是我爲數不多的C#投訴之一。 –
我相同的看法,我懷疑這就是爲什麼他們在WPF介紹IWeakEventListener。儘管如此,它很笨拙。 (他們也應該使空值不安全恕我直言) – FuleSnabel