C# annullare sottoscrizione ad evento con Espressione lambda

di il
3 risposte

C# annullare sottoscrizione ad evento con Espressione lambda

Non riesco ad  annullare una sottoscrizione ad evento con Espressione lambda

um PulsantePremuto { Niente, Pippo, Pippo2}

public event Action Button1Clicked;

Button1Clicked+= () => Results(PulsantePremuto.Niente);

Annullare la sottooscrizione all'evento con :

Button1Clicked-= () => Results(PulsantePremuto.Niente);

non funziona perchè con -= si utilizzera un metodo anonimo diverso quindi l'originale non verrà rimosso

Come posso fare?

Grazie a tutti

3 Risposte

  • Re: C# annullare sottoscrizione ad evento con Espressione lambda

    14/06/2023 - TheRunningMan ha scritto:


    non funziona perchè con -= si utilizzera un metodo anonimo diverso quindi l'originale non verrà rimosso

    Non devi usare una espressione lambda, oppure devi salvare il valore espressione in una variabile.

  • Re: C# annullare sottoscrizione ad evento con Espressione lambda

    Come faccio a salvare il valore della espressione per poter dopo annullare la sottoscizione all'evento?

  • Re: C# annullare sottoscrizione ad evento con Espressione lambda

    15/06/2023 - TheRunningMan ha scritto:


    Button1Clicked+= () => Results(PulsantePremuto.Niente);

    Qualcosa di questo tipo:

    var myCallback = () => Results(PulsantePremuto.Niente);
    // ...
    Button1Clicked+= myCallback;
    Button1Clicked-= myCallback;

    In pratica, quando crei l'espressione che restituisce un valore vero e proprio (la funzione stessa da richiamare), prima di assegnarla all'evento la salvi in una variabile.

    Usando quel riferimento in aggiunta e rimozione dell'evento, dovrebbe funzionare.

    Questo però lo vedo più come un escamotage particolare, nel senso che si dovrebbe capire lo scenario generale e vedere se si adatta bene, o se dato l'obiettivo ci sono strade più sicure, leggibili e manutenibili, ad esempio creando un metodo nella classe che assegna l'evento.

    Il fatto che si possa assegnare un gestore di evento “al volo” usando una espressione lambda al posto di creare un metodo nella classe non significa che quella soluzione vada adottata sempre: in certi casi, meglio ripiegare su soluzioni più sicure e strutturate.

    Ad ogni modo, l'indicazione era per spiegare il concetto: se vuoi togliere un gestore che hai aggiunto, devi usare lo stesso riferimento, quindi la funzione che assegni deve avere una locazione fissa, o perché è un metodo di un oggetto noto, o perché quando hai creato la funzione usando la sintassi dell'espressione lambda ti sei tenuto il suo riferimento da qualche parte (nell'esempio sopra ho usato una variabile, ma può essere un campo della classe o qualsiasi altra cosa).

    Ciao! :)

Devi accedere o registrarti per scrivere nel forum
3 risposte