Sto imparando su Eventi/Delegati in C#. Posso chiedere la tua opinione sullo stile di denominazione/codifica che ho scelto (tratto dal libro Head First C#)?Eventi - convenzione di denominazione e stile
Sto insegnando a un amico su questo domani, e sto cercando di trovare il modo più elegante di spiegare i concetti. (Pensato che il modo migliore per capire un soggetto è cercare di insegnare!)
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);
metronome.OnTick();
}
}
public class Metronome
{
// a delegate
// so every time Tick is called, the runtime calls another method
// in this case Listener.metronome_Tick
public event EventHandler Tick;
public void OnTick()
{
while (true)
{
Thread.Sleep(2000);
// because using EventHandler delegate, need to include the sending object and eventargs
// although we are not using them
Tick(this, 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");
}
}
N.B. Il codice è refactored da http://www.codeproject.com/KB/cs/simplesteventexample.aspx
Alternativa alla guardia è aggiungere "= delegate {};" to Tick declaration (si veda http://stackoverflow.com/questions/231525/raising-c-events-with-an-extension-method-is-it-bad/231536#231536) – Benjol
Si noti che la vulnerabilità non è _limitata_ ambienti multithread. È possibile (se sociopatico) per un gestore di eventi rimuovere tutti i gestori da un evento, causando un arresto anomalo quando il gestore viene completato e l'invocazione di un evento tenta di eseguire l'evento successivo (ora non esistente). –
@GregD: C'è un modo per renderlo idiotproof tale che il codice client non possa farlo? –