Blog Dla Programistów C#/.NET

Cześć! Dzisiaj porozmawiamy o eventach w C#. Jeśli kiedyś spotkałeś się z terminem "zdarzenie" w programowaniu, pewnie wiesz, że eventy pozwalają reaktywować nasz kod, czyli wywoływać pewne akcje w odpowiedzi na określone sytuacje – na przykład kliknięcia przycisku, zmianę w bazie danych czy zakończenie pobierania pliku.

W świecie .NET eventy są ściśle związane z delegatami, które pozwalają wskazać metody, jakie zostaną wywołane, gdy dane zdarzenie się "odpali". W dzisiejszym artykule przedstawię Ci, czym są eventy, jak je tworzyć i jak subskrybować w C#, aby Twoje aplikacje stały się bardziej interaktywne i modularne.

Eventy w C#: Zrozum, jak działają zdarzenia w .NET

Jak działają eventy i dlaczego są potrzebne?


W dużym uproszczeniu, event to mechanizm, który umożliwia klasie wysyłanie powiadomień innym klasom lub obiektom. Odbiorcy (subskrybenci) mogą wtedy wykonać odpowiednią akcję.

Jest to genialny sposób na luźne powiązanie (tzw. loose coupling) między komponentami Twojego systemu. Dzięki eventom klasa nie musi "znać" odbiorców – wie tylko, że istnieje zdarzenie, a kto się na nie zapisze (subskrybuje), ten zareaguje w odpowiedni sposób.


Definiowanie eventów w C#


Eventy w C# deklarujemy zwykle jako:

public event EventHandler NazwaZdarzenia;

gdzie EventHandler to delegat (lub inny delegat zdefiniowany przez nas), a NazwaZdarzenia to nazwa zdarzenia. Najprostsza postać wygląda tak:

public class Publisher
{
// Najprostsza wersja eventu oparta na wbudowanym delegacie EventHandler public event EventHandler OnSomethingHappened;

public void DoSomething()
{
Console.WriteLine("Wykonuję akcję w Publisher...");

// Wywołujemy zdarzenie OnSomethingHappened?.Invoke(this, EventArgs.Empty);
}
}

Kilka kluczowych rzeczy:
    1. event to słowo kluczowe definiujące zdarzenie.
    2. EventHandler to wbudowany delegat w .NET, który wymaga dwóch parametrów: object sender i EventArgs e.
    3. OnSomethingHappened?.Invoke(...) – znany już operator ?. zabezpiecza nas przed wywołaniem null, jeśli nikt nie subskrybuje zdarzenia.


Subskrybowanie eventów


Teraz, gdy mamy zdefiniowanego Publisher, chcemy, aby inna klasa – np. Subscriber – reagowała na zdarzenie. W tym celu Subscriber musi "zasubskrybować" event i dostarczyć metodę, która wywoła się po wystąpieniu zdarzenia:

public class Subscriber
{
public void Subscribe(Publisher publisher)
{
// Subskrybujemy event publisher.OnSomethingHappened += Publisher_OnSomethingHappened;
}

// Metoda, która zareaguje na zdarzenie private void Publisher_OnSomethingHappened(object sender, EventArgs e)
{
Console.WriteLine("Subscriber zareagował na zdarzenie OnSomethingHappened!");
}
}

W metodzie Subscribe do publisher.OnSomethingHappened dodajemy naszą metodę Publisher_OnSomethingHappened. Dzięki temu zawsze, gdy publisher wywoła zdarzenie, subskrybent zareaguje.


Uruchomienie przykładu w Main()


Żeby wszystko zadziałało, stwórzmy prosty przykład w naszej metodzie Main:

using System;

public class Program
{
public static void Main(string[] args)
{
Publisher publisher = new Publisher();
Subscriber subscriber = new Subscriber();

// Podpinamy subscriber pod zdarzenie subscriber.Subscribe(publisher);

// Uruchamiamy metodę, która wywołuje zdarzenie publisher.DoSomething();

Console.ReadLine();
}
}

Po uruchomieniu zobaczymy w konsoli najpierw komunikat z Publishera, a następnie komunikat informujący, że Subscriber zareagował.


Event z własnymi danymi (EventArgs)


Często chcemy przekazać do subskrybentów dodatkowe dane o zdarzeniu. Do tego celu świetnie nadaje się mechanizm dziedziczenia po EventArgs.

using System;

public class CustomEventArgs : EventArgs
{
public string Message { get; set; }
}

public class Publisher
{
// Event z własnym typem argumentów public event EventHandler<CustomEventArgs> OnCustomEvent;

public void DoSomethingCustom(string msg)
{
Console.WriteLine($"Publisher: wykonuję DoSomethingCustom z wiadomością: {msg}");

// Wywołanie eventu z przekazaniem dodatkowych danych OnCustomEvent?.Invoke(this, new CustomEventArgs { Message = msg });
}
}

public class Subscriber
{
public void Subscribe(Publisher publisher)
{
publisher.OnCustomEvent += Publisher_OnCustomEvent;
}

private void Publisher_OnCustomEvent(object sender, CustomEventArgs e)
{
Console.WriteLine($"Subscriber otrzymał wiadomość: {e.Message}");
}
}

Taką strukturę można dalej rozwijać, aby przekazywać bardziej złożone informacje, np. o błędach, danych obliczeniowych czy stanie aplikacji.


Gdzie najczęściej wykorzystasz eventy?


    1. Interfejs użytkownika (UI) – w aplikacjach desktopowych (np. WPF, Windows Forms) kliknięcie przycisku to event.
    2. Komunikacja między warstwami – np. w systemach zdarzeniowych, gdy klasa serwisowa powiadamia o zakończeniu długotrwałej operacji.
    3. Reagowanie na zdarzenia systemowe – np. w Unity (silnik gier), wtyczkach do Visual Studio, a nawet w ASP.NET (SignalR).
    4. Biblioteki i frameworki – .NET udostępnia mnóstwo wbudowanych eventów, np. w kontrolkach UI.


Podsumowanie


Podsumowując, eventy w C# to kluczowe narzędzie w projektach opartych na wzorcu publikator–subskrybent (publisher–subscriber). Dzięki nim aplikacje stają się bardziej modularne i łatwiejsze w utrzymaniu. Komponent wywołujący zdarzenie nie musi wiedzieć, kto na nie reaguje, a subskrybenci mogą elastycznie zmieniać swoje zachowania.

Jeśli chcesz zgłębić tajniki programowania w .NET jeszcze bardziej – zapraszam Cię do mojego szkolenia online "Zostań Programistą .NET". Znajdziesz tam wiele lekcji wprowadzających i zaawansowanych, w tym mnóstwo ćwiczeń praktycznych, dzięki którym jeszcze lepiej zrozumiesz nie tylko eventy, ale i całe bogactwo platformy .NET.

To wszystkie na dzisiaj. Jeżeli taki artykuł Ci się spodobał, to koniecznie dołącz do mojej społeczności – darmowe zapisy, gdzie będziesz również miał dostęp do dodatkowych materiałów i przede wszystkim bonusów. Do zobaczenia w kolejnym artykule.

Szkolenie Zostań Programistą .NET
Szczegóły == Zostań Programistą .NET ==
Zapisy tylko do piątku do 22:00!
Autor artykułu:
Kazimierz Szpin
Kazimierz Szpin
CTO & Founder - FindSolution.pl
Programista C#/.NET. Specjalizuje się w Blazor, ASP.NET Core, ASP.NET MVC, ASP.NET Web API, WPF oraz Windows Forms.
Autor bloga ModestProgrammer.pl
Dodaj komentarz

Wyszukiwarka

Szkolenie Zostań Programistą .NET
Szczegóły == Zostań Programistą .NET ==
Zapisy tylko do piątku do 22:00!

Zostańmy w kontakcie!

Dołącz do mojej listy mailowej, aby otrzymywać ciekawe informacje ze świata programowania. Dodatkowo będziesz informowany o nowych artykułach na blogu, a także otrzymasz wyjątkowe rabaty na moje kursy i szkolenia.

    Nienawidzę spamu, dlatego będziesz otrzymywał tylko wartościowe maile. Możesz zrezygnować z subskrypcji w dowolnym momencie ✅

    © Copyright 2025 modestprogrammer.pl. Wszelkie prawa zastrzeżone. Regulamin. Polityka prywatności. Design by Kazimierz Szpin
    Serwis wykorzystuje pliki cookies. Korzystając ze strony wyrażasz zgodę na wykorzystywanie plików cookies. dowiedz się więcej.