Darse de baja del método anónimo en C#

Resuelto Eric asked hace 16 años • 14 respuestas

¿Es posible darse de baja de un evento mediante un método anónimo?

Si me suscribo a un evento como este:

void MyMethod()
{
    Console.WriteLine("I did it!");
}

MyEvent += MyMethod;

Puedo darme de baja así:

MyEvent -= MyMethod;

Pero si me suscribo usando un método anónimo:

MyEvent += delegate(){Console.WriteLine("I did it!");};

¿Es posible darse de baja de este método anónimo? ¿Si es así, cómo?

Eric avatar Oct 08 '08 22:10 Eric
Aceptado
Action myDelegate = delegate(){Console.WriteLine("I did it!");};

MyEvent += myDelegate;


// .... later

MyEvent -= myDelegate;

Simplemente mantenga una referencia al delegado.

Jacob Krall avatar Oct 08 '2008 15:10 Jacob Krall

Una técnica consiste en declarar una variable para contener el método anónimo que luego estaría disponible dentro del propio método anónimo. Esto funcionó para mí porque el comportamiento deseado era cancelar la suscripción después de que se manejara el evento.

Ejemplo:

MyEventHandler foo = null;
foo = delegate(object s, MyEventArgs ev)
    {
        Console.WriteLine("I did it!");
        MyEvent -= foo;
    };
MyEvent += foo;
J c avatar Oct 08 '2008 15:10 J c

Desde que se lanzó la función de funciones locales de C# 7.0 , el enfoque sugerido por Jc se vuelve realmente interesante.

void foo(object s, MyEventArgs ev)
{
    Console.WriteLine("I did it!");
    MyEvent -= foo;
};
MyEvent += foo;

Entonces, honestamente, aquí no tienes una función anónima como variable. Pero supongo que la motivación para usarlo en su caso se puede aplicar a funciones locales.

mazharenko avatar Aug 15 '2017 05:08 mazharenko