Jak subskrybować i anulować subskrypcję zdarzeń (Przewodnik programowania w języku C#)
Subskrybujesz zdarzenie, które jest publikowane przez inną klasę, gdy chcesz napisać kod niestandardowy, który jest wywoływany po wystąpieniu tego zdarzenia. Możesz na przykład zasubskrybować zdarzenie przycisku click
, aby aplikacja zrobiła coś przydatnego, gdy użytkownik kliknie przycisk.
Aby subskrybować zdarzenia przy użyciu środowiska IDE programu Visual Studio
Jeśli nie widzisz okna Właściwości , w widoku Projekt kliknij prawym przyciskiem myszy formularz lub kontrolkę, dla której chcesz utworzyć procedurę obsługi zdarzeń, a następnie wybierz pozycję Właściwości.
W górnej części okna Właściwości kliknij ikonę Zdarzenia .
Kliknij dwukrotnie zdarzenie, które chcesz utworzyć, na przykład
Load
zdarzenie.Program Visual C# tworzy pustą metodę obsługi zdarzeń i dodaje ją do kodu. Możesz też ręcznie dodać kod w widoku Kod . Na przykład następujące wiersze kodu deklarują metodę obsługi zdarzeń, która zostanie wywołana, gdy
Form
klasa zgłosiLoad
zdarzenie.private void Form1_Load(object sender, System.EventArgs e) { // Add your form load event handling code here. }
Wiersz kodu wymagany do subskrybowania zdarzenia jest również automatycznie generowany w
InitializeComponent
metodzie w pliku Form1.Designer.cs w projekcie. Przypomina to:this.Load += new System.EventHandler(this.Form1_Load);
Aby programowo subskrybować zdarzenia
Zdefiniuj metodę obsługi zdarzeń, której podpis jest zgodny z podpisem delegata dla zdarzenia. Jeśli na przykład zdarzenie jest oparte na typie delegata EventHandler , następujący kod reprezentuje wycinkę metody:
void HandleCustomEvent(object sender, CustomEventArgs a) { // Do something useful here. }
Użyj operatora przypisania dodawania (
+=
), aby dołączyć program obsługi zdarzeń do zdarzenia. W poniższym przykładzie przyjęto założenie, że obiekt o nazwiepublisher
ma zdarzenie o nazwieRaiseCustomEvent
. Należy pamiętać, że klasa subskrybenta wymaga odwołania do klasy wydawcy w celu subskrybowania jej zdarzeń.publisher.RaiseCustomEvent += HandleCustomEvent;
Możesz również użyć wyrażenia lambda, aby określić procedurę obsługi zdarzeń:
public Form1() { InitializeComponent(); this.Click += (s,e) => { MessageBox.Show(((MouseEventArgs)e).Location.ToString()); }; }
Aby subskrybować zdarzenia przy użyciu funkcji anonimowej
Jeśli nie musisz później anulować subskrypcji zdarzenia, możesz użyć operatora przypisania dodawania (+=
), aby dołączyć funkcję anonimową jako procedurę obsługi zdarzeń. W poniższym przykładzie załóżmy, że obiekt o nazwie ma zdarzenie o nazwie publisher
RaiseCustomEvent
i że CustomEventArgs
klasa została również zdefiniowana do przenoszenia pewnych wyspecjalizowanych informacji o zdarzeniach. Należy pamiętać, że klasa subskrybenta wymaga odwołania do publisher
w celu subskrybowania jego zdarzeń.
publisher.RaiseCustomEvent += (object o, CustomEventArgs e) =>
{
string s = o.ToString() + " " + e.ToString();
Console.WriteLine(s);
};
Nie można łatwo anulować subskrypcji zdarzenia, jeśli do subskrybowania użyto funkcji anonimowej. Aby anulować subskrypcję w tym scenariuszu, wróć do kodu, w którym subskrybujesz zdarzenie, zapisz funkcję anonimową w zmiennej delegata, a następnie dodaj delegata do zdarzenia. Zalecamy, aby nie używać funkcji anonimowych do subskrybowania zdarzeń, jeśli musisz anulować subskrypcję zdarzenia w późniejszym momencie w kodzie. Aby uzyskać więcej informacji na temat funkcji anonimowych, zobacz Wyrażenia lambda.
Anulowanie subskrypcji
Aby zapobiec wywoływaniu programu obsługi zdarzeń podczas wywoływanego zdarzenia, anuluj subskrypcję zdarzenia. Aby zapobiec wyciekom zasobów, należy anulować subskrypcję zdarzeń przed likwidacją obiektu subskrybenta. Dopóki nie anulujesz subskrypcji zdarzenia, delegat multiemisji, który stanowi część zdarzenia w obiekcie publikowania, ma odwołanie do delegata, który hermetyzuje procedurę obsługi zdarzeń subskrybenta. Tak długo, jak obiekt publikowania przechowuje to odwołanie, odzyskiwanie pamięci nie spowoduje usunięcia obiektu subskrybenta.
Aby anulować subskrypcję wydarzenia
Użyj operatora przypisania odejmowania (
-=
), aby anulować subskrypcję zdarzenia:publisher.RaiseCustomEvent -= HandleCustomEvent;
Gdy wszyscy subskrybenci anulowali subskrypcję zdarzenia, wystąpienie zdarzenia w klasie wydawcy ma wartość
null
.