es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Uso de asignar una Acción de evento a otra Acción de evento.

Dado el siguiente código:

public class A {
    public event Action SomethingChangedA = null;

    public void Trigger() {
        SomethingChangedA?.Invoke();
    }
}

public class B {
    public A a;
    public event Action SomethingChangedB = null;

    public B() {
        a = new A();
        // Primer enfoque
        a.SomethingChangedA += SomethingChangedB;
        // Segundo enfoque
        a.SomethingChangedA += () => SomethingChangedB?.Invoque();
    }
}

public class C {
    public B b;

    public C() {
        b = new B();
        b.SomethingChangedB += DoSomethingOnC;
    }

    public void DoSomethingOnC() {
        Console.WriteLine("¡Algo!");
    }
}

Si llamo a:

C c = new C();
A a = c.b.a;

a.Trigger();

Mi primera idea es que la salida será “¡Algo!” 2 veces, sin embargo, el primer enfoque no es llamado.

Después de pensar un poco, tiene sentido en mi mente que:

a.SomethingChangedA += SomethingChangedB;

No está llamando algo, sino simplemente asignando …¿la referencia de la memoria reservada para la acción?

Pensé que sabía lo que estaba sucediendo y por qué sucede esto, pero no soy lo suficientemente inteligente como para explicarlo a otra persona… así que probablemente no sé realmente por qué está sucediendo esto.

Entonces, tengo dos preguntas:

  1. ¿Cómo puedo explicar por qué esto está sucediendo?
  2. ¿Qué tipo de caso utilizará este enfoque de asignar una acción a otra acción?
Tags:  , , ,

Answer

  1. Avatar for davy.ai
    1. En el primer enfoque, cuando se llama a a.SomethingChangedA += SomethingChangedB;, SomethingChangedB se asigna como manejador para el evento SomethingChangedA de a. Sin embargo, en ese momento, SomethingChangedB todavía es null (ya que aún no se le ha asignado un valor). Por lo tanto, SomethingChangedB no se agrega como manejador del evento. Por otro lado, en el segundo enfoque (a.SomethingChangedA += () => SomethingChangedB?.Invoke();), se utiliza una expresión lambda para crear un nuevo delegado que invoca a SomethingChangedB (que puede ser null o no) cada vez que se produce el evento SomethingChangedA. Esto asegura que SomethingChangedB siempre se usa como manejador del evento, incluso si es null.

    2. En algunos casos, es posible que deseemos asignar un manejador de eventos a otro manejador de eventos. Por ejemplo, podemos tener una situación en la que se necesitan activar múltiples eventos al mismo tiempo, pero no queremos escribir el mismo código para cada manejador de eventos. En tales casos, podemos asignar un manejador de eventos a otro manejador de eventos y luego agregar este último como manejador para múltiples eventos. Esto puede simplificar el código y reducir redundancias.

Comments are closed.