* questo era nel corpo domanda
Quale potrebbe essere molto utile è un non banale esempio di un'app che utilizza eventi (suppongo che aiuti davvero anche i test?)
I pensieri finora sono:
Perché utilizzare Eventi o pubblicare/iscriversi?
Qualsiasi numero di classi può essere notificato quando viene generato un evento.
La sottoscrizione classi non hanno bisogno di sapere come il metronomo (vedi codice qui sotto) funziona, e il metronomo non ha bisogno di sapere che cosa stanno andando a fare in risposta all'evento
L'editore e gli abbonati sono disaccoppiati dal delegato. Questo è altamente auspicabile in quanto rende il codice più flessibile e robusto. Il metronomo può cambiare il modo in cui rileva il tempo senza interrompere nessuna delle classi di iscrizione. Le classi di iscrizione possono cambiare il modo in cui rispondono alle variazioni di orario senza rompere il metronomo. Le due classi ruotano indipendentemente l'una dall'altra, il che rende il codice più facile da mantenere.
class Program
{
static void Main()
{
// setup the metronome and make sure the EventHandler delegate is ready
Metronome metronome = new Metronome();
// wires up the metronome_Tick method to the EventHandler delegate
Listener listener = new Listener(metronome);
ListenerB listenerB = new ListenerB(metronome);
metronome.Go();
}
}
public class Metronome
{
// a delegate
// so every time Tick is called, the runtime calls another method
// in this case Listener.metronome_Tick and ListenerB.metronome_Tick
public event EventHandler Tick;
// virtual so can override default behaviour in inherited classes easily
protected virtual void OnTick(EventArgs e)
{
// null guard so if there are no listeners attached it wont throw an exception
if (Tick != null)
Tick(this, e);
}
public void Go()
{
while (true)
{
Thread.Sleep(2000);
// because using EventHandler delegate, need to include the sending object and eventargs
// although we are not using them
OnTick(EventArgs.Empty);
}
}
}
public class Listener
{
public Listener(Metronome metronome)
{
metronome.Tick += new EventHandler(metronome_Tick);
}
private void metronome_Tick(object sender, EventArgs e)
{
Console.WriteLine("Heard it");
}
}
public class ListenerB
{
public ListenerB(Metronome metronome)
{
metronome.Tick += new EventHandler(metronome_Tick);
}
private void metronome_Tick(object sender, EventArgs e)
{
Console.WriteLine("ListenerB: Heard it");
}
}
Articolo completo che sto scrivendo sul mio sito: http://www.programgood.net/
nb alcune di questo testo è da http://www.akadia.com/services/dotnet_delegates_and_events.html
Cin cin.
fonte
2009-04-09 05:12:52
questo è un sito di domande e risposte, non un blog ... se vuoi davvero ottenere un feedback qui, riduci la domanda a ... solo la domanda e posta il resto come risposta. – Shog9