Estoy aprendiendo sobre eventos/delegados en C#. ¿Podría preguntar su opinión sobre el estilo de nomenclatura/codificación que he elegido (tomado del libro de Head First C#)?Eventos: convención y estilo de nomenclatura
Estoy enseñando a un amigo sobre esto mañana, y estoy tratando de encontrar la forma más elegante de explicar los conceptos. (Pensó que la mejor manera de entender un tema es tratar de enseñar!)
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. El código se refactoriza desde http://www.codeproject.com/KB/cs/simplesteventexample.aspx
Alternativa al guardia es agregar "= delegar {};" a la declaración Tick (ver http://stackoverflow.com/questions/231525/raising-c-events-with-an-extension-method-is-it-bad/231536#231536) – Benjol
Tenga en cuenta que la vulnerabilidad no es _limitada_ a entornos multiproceso. Es posible (si es sociópata) que un manejador de eventos elimine todos los manejadores de un evento, lo que da como resultado un bloqueo cuando el manejador finaliza y la invocación de evento intenta ejecutar el siguiente evento (ahora inexistente). –
@GregD: ¿Hay alguna manera de ponerlo a prueba de manera que el código del cliente no pueda hacer eso? –