Uczę się o zdarzeniach/delegatach w języku C#. Czy mógłbym zapytać o twoją opinię na temat wybranego przeze mnie stylu/stylu kodowania (zaczerpniętego z książki Head First C#)?Zdarzenia - nazewnictwo konwencji i stylu
Nauczam o tym przyjaciela o tym jutro i staram się wymyślić najbardziej elegancki sposób wyjaśnienia pojęć. (Myślałem najlepszym sposobem na zrozumienie tematu jest, aby spróbować i nauczyć go!)
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");
}
}
nb Kod jest refaktoryzowany z http://www.codeproject.com/KB/cs/simplesteventexample.aspx
Alternatywą dla wartownika jest dodanie "= delegate {};" deklaracji Tick (zobacz http://stackoverflow.com/questions/231525/raising-c-events-with-anextext-method-is-it-bad/231536#231536) – Benjol
Należy pamiętać, że luka nie jest _ograniczona_ do środowiska wielowątkowe. Jest możliwe (jeśli socjopatyczne), że funkcja obsługi zdarzeń usunie wszystkie procedury obsługi ze zdarzenia, powodując awarię po zakończeniu obsługi, a wywołanie zdarzenia spowoduje uruchomienie następnego (obecnie nieistniejącego) zdarzenia. –
@GregD: Czy jest jakiś sposób na to, żeby go odblokować, aby kod klienta nie mógł tego zrobić? –