* to kiedyś w organizmie zapytania
Jaki byłby bardzo przydatny jest nie trywialny Przykład aplikacji, która wykorzystuje zdarzenia (chyba to naprawdę pomaga w testowaniu?)
Dotychczasowe myśli to:
Dlaczego warto korzystać z wydarzeń lub publikować/subskrybować?
Dowolna liczba klas może być powiadomiona o wydarzeniu.
sygnatariuszy klasy nie muszą wiedzieć, jak metronom (patrz kod poniżej) działa, a Metronome nie musi wiedzieć, co mają zamiar zrobić w odpowiedzi na zdarzenie
wydawcy i abonentów są oddzielone przez delegata. Jest to wysoce pożądane, ponieważ zapewnia bardziej elastyczny i odporny kod. Metronom może zmienić sposób wykrywania czasu bez zrywania żadnej z subskrybujących klas. Subskrybujące klasy mogą zmieniać sposób reagowania na zmiany czasu bez przerywania metronomu. Dwie klasy obracają się niezależnie od siebie, co sprawia, że kod jest łatwiejszy w utrzymaniu.
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");
}
}
Pełny artykuł piszę na mojej stronie: http://www.programgood.net/
nb część tego tekstu jest od http://www.akadia.com/services/dotnet_delegates_and_events.html
Cheers.
To jest witryna z pytaniami i odpowiedziami, a nie blog ... jeśli naprawdę chcesz uzyskać tutaj opinię, zredukuj swoje pytanie do ... tylko pytania, a resztę zostaw jako odpowiedzi. – Shog9