Saltar al contenido

¿Por qué usar eventos para lo que puedo hacer con Delegados?

Revisamos cada una de las reseñas en nuestro sitio web con la meta de mostrarte en todo momento información veraz y actualizada.

Solución:

Imagina que tienes 3 suscriptores que están interesados ​​en algún evento. Imaginemos además que están interesados ​​en recibir eventos del mismo EventTester instancia. Para abreviar, dejemos de lado los detalles de cómo se pasa exactamente la misma instancia a todos los clientes. Cuando yo digo clientelame refiero a cualquier clase que esté suscrita al evento.

Aquí está la instancia:

EventTester evt = new EventTester();

Se han suscrito al evento de la instancia anterior como se muestra a continuación:

Cliente 1

evt.someEvent += Client1Handler1;
evt.someEvent += Client1Handler2;

Cliente 2

evt.someEvent += Client2Handler1;

Cliente 3

evt.someEvent += Client3Handler1;
evt.someEvent += Client3Handler2;

Cliente 4:

Imagine que el cliente 4 hizo uno de los 3 a continuación:

// 1: See Note 1 below
evt.someEvent = null;

// 2: See Note 2 below
evt.someEvent = new someEventDelegate(MyHandler);

// 3: See Note 3 below
evt.someEvent();

//...
private void MyHandler()

    MessageBox.Show("Client 4");

Nota 1

Los clientes 1, 2 y 3 ya no recibirán ningún evento. ¿Por qué? Porque el Cliente 4 acaba de hacer esto evt.someEvent = null; y en EventTester tienes esta línea de código:

if (someEvent != null) someEvent();

Dado que esa condición ya no pasará, no se generará ningún evento. Por cierto, no hay nada malo con la línea de código anterior. Pero existe el problema con el uso de delegados: Se puede asignar a.

Nota 2

Se ha sobrescrito por completo en una nueva instancia. Ahora, independientemente del cliente, todos verán un cuadro de mensaje que dice “Cliente 4”.

Nota 3

Ups, de repente, uno de los clientes está transmitiendo el evento.


Imagina por un segundo EventTester era un Button y someEvent era Click. Imagina que tienes varios clientes interesados ​​en el evento de clic de este botón. De repente, un cliente decide que nadie más debería recibir notificaciones (Nota 1). O un cliente decide que cuando se haga clic en el botón, se manejará solo de 1 manera (Nota 2). O ha tomado la decisión de decidir cuándo se hace clic en un botón aunque el botón pueda no se ha hecho clic (Nota 3).


si tienes un event y uno de los clientes intentó lo anterior, no se le permitirá y obtendrá un error de compilación, como este:

ingrese la descripción de la imagen aquí

Claro, puede usar delegados porque detrás de escena, un evento es una construcción que envuelve a un delegado.

Pero la razón de usar eventos en lugar de delegados es la misma que usar propiedades en lugar de campos: encapsulación de datos. Es una mala práctica exponer los campos (sean lo que sean, campos primitivos o delegados) directamente.

Por cierto, te perdiste un public palabra clave antes de su campo delegado para hacerlo posible en el segundo fragmento.

Otro “por cierto” con el segundo fragmento: para los delegados deberías usar Delegate.Combine en lugar de “+=”.

El objetivo principal de los eventos es evitar que los suscriptores interfieran entre sí. Si no usa eventos, puede:

Reemplazar a otros suscriptores reasignando delegado (en lugar de usar el operador +=), Borrar todos los suscriptores (estableciendo delegado en null), Difundir a otros suscriptores invocando al delegado.

Fuente: C# en pocas palabras

Reseñas y calificaciones de la guía

Agradecemos que desees añadir valor a nuestra información dando tu experiencia en las explicaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *