2012-09-18 138 views

回答

6

是的,這是正確的語法。但是,我們建議您使用函數處理函數而不是lambda函數,因爲lambda函數可以引入循環引用並防止釋放內存。

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

一般來說,它的更好,除非你採取非常謹慎,以避免循環 引用使用命名功能,而不是拉姆達 的事件處理程序。一個命名的函數通過弱的 引用捕獲「this」指針,而lambda通過強引用捕獲它,並且 創建一個循環引用。有關更多信息,請參閱弱 引用和中斷週期(C++/CX)。

4

這就是我最終做的。

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

如果我理解ThomasP以上也不會被強REF捕獲此,並因此產生一個循環引用創建潛在內存泄漏。 http://msdn.microsoft.com/en-US/library/windows/apps/hh699859.aspx似乎暗示你應該使用WeakReference捕獲這個? – FuleSnabel

+0

不幸的是,事件使用強烈的參考。我什麼時候需要一個事件來保持對象的活性?這是我爲數不多的C#投訴之一。 –

+0

我相同的看法,我懷疑這就是爲什麼他們在WPF介紹IWeakEventListener。儘管如此,它很笨拙。 (他們也應該使空值不安全恕我直言) – FuleSnabel

相關問題