Zdarzenia – wywołanie, wykorzystanie i obsługa
Zdarzenia
Jeśli chcemy, ażeby jakiś fragment kodu reagował na zdarzenia z innego obiektu musimy przypisać funkcję obsługującą zdarzenie. Metoda obsługująca zdarzenie powinna przyjmować dwa parametry:
- obiekt klasy Object, który informuje przez co zostało wywołane zdarzenie
- obiekt z argumentami zdarzenia typu dziedziczącego po EventArgs
Przypisanie wygląda następująco
1 2 3 |
Object.Event += EventHandlerMethod; // Gdzie EventHandlerMethod jest odpowiednią metodą Object.Event += (obj, eventArgs)=> {/* logika obsługi zdarzenia*/}; |
W pierwszym przypadku wykorzystujemy metodę do obsługi zdarzenia, a w drugim metodę anonimową. Jeśli nie chcemy więcej otrzymywać informacji o zdarzeniach powinniśmy się wypisać z listy metod informowanych o zdarzeniach przy pomocy operatora -=
1 |
Object.Event -= EventHandlerMethod; // Gdzie EventHandler jest odpowiednią metodą |
Deklaracja własnego zdarzenia
W celu zadeklarowania własnego eventu wykorzystujemy
1 |
public event EventHandler MyEvent; |
Deklaracja ta powinna się znajdować wewnątrz klasy, która będzie to zdarzenie udostepniać.
Wywołanie zdarzenia
Jeśli chcemy wywołać zdarzenia poprzez nasz kod musimy obowiązkowo sprawdzić czy ktoś je zasubskrybował. Obecnie takie wywołanie jest proste
1 |
MyEvent?.Invoke(this, MyEventArguments); |
Konstrukcja ta jest dostępna od C# w wersji 6. W poprzednich wersjach powinniśmy sprawdzić czy event nie jest null-em.
1 2 3 4 5 6 |
var myEvent = MyEvent ; if(myEvent != null) { myEvent(this, MyEventArguments); } |
Wykorzystanie zmiennej lokalnej jest zalecane w celu zapewnienia, że żaden wątek nie zmodyfikuje nam wartości pomiędzy sprawdzeniem a wywołaniem zdarzenia.