En este modelo, que tienen los editores que van a hacer algo de lógica y publicar un "evento".
Los editores luego enviarán su evento solo a los suscriptores que se hayan suscrito para recibir el evento específico.
En C#, cualquier objeto puede publicar un conjunto de eventos al que otras aplicaciones pueden suscribirse.
Cuando la clase de publicación plantea un evento, se notifican todas las aplicaciones suscritas.
La siguiente figura muestra este mecanismo.
ejemplo más simple posible en Eventos y delegados en C#:
código se explica por sí, también he añadido los comentarios para limpiar el código.
using System;
public class Publisher //main publisher class which will invoke methods of all subscriber classes
{
public delegate void TickHandler(Publisher m, EventArgs e); //declaring a delegate
public TickHandler Tick; //creating an object of delegate
public EventArgs e = null; //set 2nd paramter empty
public void Start() //starting point of thread
{
while (true)
{
System.Threading.Thread.Sleep(300);
if (Tick != null) //check if delegate object points to any listener classes method
{
Tick(this, e); //if it points i.e. not null then invoke that method!
}
}
}
}
public class Subscriber1 //1st subscriber class
{
public void Subscribe(Publisher m) //get the object of pubisher class
{
m.Tick += HeardIt; //attach listener class method to publisher class delegate object
}
private void HeardIt(Publisher m, EventArgs e) //subscriber class method
{
System.Console.WriteLine("Heard It by Listener");
}
}
public class Subscriber2 //2nd subscriber class
{
public void Subscribe2(Publisher m) //get the object of pubisher class
{
m.Tick += HeardIt; //attach listener class method to publisher class delegate object
}
private void HeardIt(Publisher m, EventArgs e) //subscriber class method
{
System.Console.WriteLine("Heard It by Listener2");
}
}
class Test
{
static void Main()
{
Publisher m = new Publisher(); //create an object of publisher class which will later be passed on subscriber classes
Subscriber1 l = new Subscriber1(); //create object of 1st subscriber class
Subscriber2 l2 = new Subscriber2(); //create object of 2nd subscriber class
l.Subscribe(m); //we pass object of publisher class to access delegate of publisher class
l2.Subscribe2(m); //we pass object of publisher class to access delegate of publisher class
m.Start(); //starting point of publisher class
}
}
Salida:
lo oyó por Listener
lo oyó por listener2
lo oyó por Listener
lo oyó por listener2
lo oyó por Escucha er . . . (infinitas veces)
Para ahorrarse unas pocas líneas y evitar la verificación nula, inicialice su evento de esta manera: http://stackoverflow.com/questions/340610/create-empty-c-event-handlers-automatically/ 340618 # 340618 – Dinah
@Dinah: Eso no evita la verificación nula. Todavía puede establecer 'SomethingHappened = null' más tarde (una forma práctica pero floja y no ideal para anular la suscripción a todos los manejadores), por lo que la verificación nula siempre es necesaria. –
@DanPuzey: Puedes dentro de la clase, pero igualmente puedes asegurarte de que * no * lo haces, y * el otro código no puede hacerlo, ya que solo puede suscribirse y anular la suscripción. Si se asegura de que nunca lo configure como nulo deliberadamente dentro de su clase, está bien evitar la verificación nula. –