2012-09-18 13 views

risposta

6

Sì, questa è la sintassi corretta. Tuttavia, si consiglia di utilizzare un gestore di funzioni anziché un lambda perché un lambda può introdurre riferimenti circolari e impedire che la memoria venga liberata.

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

In generale, è meglio utilizzare una funzione chiamata, piuttosto che una lambda, per un gestore di eventi a meno che non si prende molta cura per evitare circolari riferimenti. Una funzione con nome cattura il puntatore "this" con il riferimento debole , mentre un lambda lo cattura per riferimento forte e crea un riferimento circolare. Per ulteriori informazioni, vedere Deboli riferimenti e cicli di interruzione (C++/CX).

4

Ecco cosa ho fatto.

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

Se ho capito che ThomasP di cui sopra non lo catturerebbe con ref forte e quindi creerebbe un riferimento circolare creando una potenziale perdita di memoria. http://msdn.microsoft.com/en-US/library/windows/apps/hh699859.aspx sembra implicare che dovresti catturarlo usando WeakReference? – FuleSnabel

+0

È spiacevole che gli eventi utilizzino riferimenti forti. Quando vorrei un evento per mantenere vivo un oggetto? Questa è una delle mie poche lamentele su C#. –

+0

Sono della stessa opinione e sospetto che sia per questo che hanno introdotto IWeakEventListener in WPF. Comunque è un clunk. (Dovrebbero anche aver reso i valori nulli IMHO non sicuri) – FuleSnabel

Problemi correlati