In questo modello, si hanno gli editori che farà un po 'di logica e pubblicare un "evento".
Gli editori invieranno il loro evento solo agli abbonati che si sono abbonati per ricevere l'evento specifico.
In C#, qualsiasi oggetto può pubblicare un set di eventi a cui altre applicazioni possono iscriversi.
Quando la classe di pubblicazione genera un evento, vengono notificate tutte le applicazioni sottoscritte.
La figura seguente mostra questo meccanismo.
più semplice esempio possibile in Eventi e delegati in C#:
codice si spiega da sé, inoltre ho aggiunto i commenti per cancellare il codice.
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
}
}
uscita:
sentito da Listener
sentito da Listener2
sentito da Listener
E Sentito da Listener2
E ascoltati dal Ascolta er . . . (infinite volte)
Per risparmiare alcune righe ed evitare il controllo null, inizializza il tuo evento in questo modo: http://stackoverflow.com/questions/340610/create-empty-c-event-handlers-automatically/ 340618 # 340618 – Dinah
@Dinah: Ciò non evita il controllo nullo. Puoi ancora impostare 'SomethingHappened = null' in un secondo momento (un metodo pratico, se pigro e non ideale, per annullare l'iscrizione di tutti i gestori), quindi il controllo null è sempre necessario. –
@DanPuzey: Puoi farlo all'interno della classe, ma allo stesso tempo puoi assicurarti che * non lo faccia * e * l'altro * codice non possa farlo, in quanto può solo iscriversi e disiscriversi. Se ti assicuri che non lo imposti mai in modo deliberato all'interno della tua classe, va bene evitare il controllo nullo. –