C# ZDARZENIA


Teraz zajmiemy się zdarzeniami. Dzięki zdarzeniom wszystkie podpięte do nich metody za pomocą delegat zostaną wywołane gdy wywołamy zdarzenie. Używanie zdarzeń jest bardzo proste, do jednego zdarzenia może być podpiętych kilka metod, które działają jak łańcuch wywołań. Przejdźmy zatem do ogólnej deklaracji zdarzeń:

dostęp event nazwa_delegaty nazwa_zdarzenia ;

Dzięki temu, że korzystamy tutaj z delegat to mamy pewność, że zostaną podpięte tylko te metody które będą spełniać warunek deklaracji narzucony przez delegate. Przejdziemy tutaj do prostego przykładu w którym utworzymy zdarzenie które będzie wywoływanie gdy będziemy chcieli zapisać element do tablicy, posłużymy się tutaj indekserem.

Początek kodu:
using System;


delegate void tablicowy_uchwyt() ;


class A
{


public void Metoda1()
{
Console.WriteLine(„Została wywołana metoda: Metoda1() klasy A”);
}
}


class B
{
public static void Metoda2()
{
Console.WriteLine(„Została wywołana metoda: Metoda2() klasy B”);
}
}


class Tablica
{


public event tablicowy_uchwyt zmiana;


int[] tab;


public Tablica(int rozmiar)
{
tab = new int[rozmiar];
}


public int this[int indeks]
{
get
{
return tab[indeks];
}
set
{
tab[indeks] = value;
Wywolaj_zmiana();
}
}


private void Wywolaj_zmiana()
{
if (zmiana != null)
{
zmiana();
}
}
}


class Pokaz
{
public static void Main()
{
Tablica pierwsza = new Tablica(10);
A obiekt_a = new A();
tablicowy_uchwyt TU1 = new tablicowy_uchwyt(obiekt_a.Metoda1);
tablicowy_uchwyt TU2 = new tablicowy_uchwyt(B.Metoda2);


pierwsza.zmiana += TU1;
pierwsza.zmiana += TU2;


pierwsza[0] = 34;


Console.WriteLine(„Odejmujemy teraz jeden uchwyt”);


pierwsza.zmiana -= TU1;
pierwsza[1] = 5901;
}
}

Koniec kodu:

Pora na mała interpretację. Na samym początku deklarujemy delegatę która to posłuży nam za uchwyt do zdarzenia, następnie deklarujemy dwie bardzo proste klasy w których to są metody które zostaną przypisane do obiektów delegaty. Następnie w klasie Tablica na samym początku deklarujemy zdarzenie o nazwie zmiana. Zdarzenie w którymś momencie musi zostać wywołane (przecież do tego ma służyć), ale jeszcze zanim je wywołamy musimy sprawdzić czy zdarzenie ma na pewno jakieś przypisane uchwyty czyli czy nie jest null, aby nie pisać wiele razy tego samego kodu posłużyliśmy się tutaj metodą: Wywolaj_zmiana() w której to jest kod sprawdzający czy zdarzenie nie jest null oraz kod wywołujący zdarzenie:

zmiana();

Teraz wywołując metodę Wywolaj_zmiana() wywołamy również zdarzenie, tak naprawdę właśnie w taki sposób należy wywoływać zdarzenie czyli poprzez tak zwaną metodę wywołującą. W naszym przypadku jest ona ustawiona na private gdyż błędem by było wywołanie jej z zewnątrz klasy