Domanda

Ho il seguente codice per consentire alla GUI di rispondere a una modifica nella raccolta.

myObservableCollection.CollectionChanged += ((sender, e) => UpdateMyUI());

Innanzitutto è un buon modo per farlo?

Secondo: qual è il codice per annullare l'iscrizione a questo evento? È lo stesso ma con - = (e poi di nuovo il metodo anonimo completo)?

È stato utile?

Soluzione

Se è necessario annullare l'iscrizione a un evento, è necessario un riferimento istanziato. Sfortunatamente, ciò significa che non puoi usare quella sintassi particolare.

Altri suggerimenti

Prima di tutto ... sì, è un buon modo per farlo, è pulito, piccolo e facile da leggere & amp; capire ... l'avvertimento ovviamente è "A meno che non si desideri in seguito annullare l'iscrizione".

Credo che Jon Skeet sottolineato prima " la specifica esplicitamente non garantisce il comportamento in entrambi i casi quando si tratta di equivalenza di delegati creati con metodi anonimi. "

Quindi, se è necessario annullare l'iscrizione all'evento in un secondo momento, sarebbe meglio creare effettivamente un'istanza delegata in modo da poter rimanere aggrappati al riferimento per dopo.

var myDelegate = delegate(sender, e){UpdateMyUI()};

myObservableCollection.CollectionChanged += myDelegate;

myObservableCollection.CollectionChanged -= myDelegate;

È una buona strada da percorrere, a meno che myObservableCollection non vivrà più a lungo di "questo", nel qual caso potresti finire con una perdita di memoria, poiché il delegato che viene creato dietro le quinte conserva un riferimento al tuo " questo ', che lo manterrà vivo. Se stai creando e "distruggendo" ripetutamente qualsiasi cosa stia ascoltando l'evento, scoprirai che non vengono raccolti dal garbage collector.

Se questo è un problema, puoi seguire il percorso suggerito nelle risposte, conservando un riferimento al gestore, che devi creare per primo.

Un'altra soluzione è quella di utilizzare riferimenti deboli per creare un gestore eventi che consenta di raccogliere l'abbonato se non ci sono altri riferimenti. Ho esplorato questa soluzione in questa domanda e rispondi .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top