0Pricing
C# Academy · Lekcja

Zdarzenia: publikowanie/subskrypcja, słowo kluczowe event

Proszę używać zdarzeń w modelu publikowanie/subskrypcja: deklarować event, dodawać i usuwać handlery, przekazywać dane za pomocą EventArgs oraz zgłaszać zdarzenia według wzorca OnX.

Zdarzenia: publikowanie/subskrypcja, słowo kluczowe event to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 2 z 3. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 3 lekcji w sumie.

Przegląd zdarzeń

Cel: Publikować i subskrybować za pomocą zdarzeń.

  • Deklarować zdarzenie u wydawcy
  • Subskrybować za pomocą += i anulować subskrypcję za pomocą -=
  • Bezpiecznie zgłaszać zdarzenie u wydawcy
  • Przekazywać dane za pomocą EventArgs

Podstawy używania zdarzeń

Udostępnij zdarzenie i pozwól odbiorcom dołączać oraz odłączać obsługę. Tylko wydawca może je wywołać.

using System;

public class Button
{
  public event EventHandler Click;

  public void SimulateClick()
  {
    // Safe raise: copy then invoke if not null (C# 6-safe)
    EventHandler h = Click;
    if (h != null) h(this, EventArgs.Empty);
  }
}

public class Program
{
  static void OnClick(object sender, EventArgs e)
  {
    Console.WriteLine("Clicked!");
  }

  public static void Main(string[] args)
  {
    Button b = new Button();
    b.Click += OnClick;    // subscribe
    b.SimulateClick();     // prints "Clicked!"

    b.Click -= OnClick;    // unsubscribe
    b.SimulateClick();     // no output
  }
}

Zdarzenie z danymi

Używaj EventArgs (lub EventHandler<TEventArgs>), aby przekazywać przydatne dane subskrybentom.

using System;

// Data for the event
public sealed class PriceChangedEventArgs : EventArgs
{
  public decimal OldPrice { get; private set; }
  public decimal NewPrice { get; private set; }
  public PriceChangedEventArgs(decimal oldP, decimal newP)
  {
    OldPrice = oldP; NewPrice = newP;
  }
}

public sealed class Product
{
  private decimal _price;
  public event EventHandler<PriceChangedEventArgs> PriceChanged;

  public decimal Price
  {
    get { return _price; }
    set
    {
      if (value != _price)
      {
        decimal old = _price;
        _price = value;
        EventHandler<PriceChangedEventArgs> h = PriceChanged;
        if (h != null) h(this, new PriceChangedEventArgs(old, _price));
      }
    }
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Product p = new Product();
    p.PriceChanged += delegate(object s, PriceChangedEventArgs e)
    {
      Console.WriteLine("Price: " + e.OldPrice + " -> " + e.NewPrice);
    };
    p.Price = 10m;
    p.Price = 12m;
  }
}

Delegaty wielokrotne i wyrażenia lambda

Zdarzenia są wielokrotne: wiele procedur obsługi jest uruchamianych w kolejności subskrypcji. Używaj nazwanych lub anonimowych procedur obsługi.

using System;

public class Alarm
{
  public event EventHandler Ring;

  public void Trigger()
  {
    EventHandler h = Ring;
    if (h != null) h(this, EventArgs.Empty);
  }
}

public class Program
{
  static void HandlerA(object s, EventArgs e) { Console.WriteLine("A"); }
  static void HandlerB(object s, EventArgs e) { Console.WriteLine("B"); }

  public static void Main(string[] args)
  {
    Alarm a = new Alarm();
    a.Ring += HandlerA;                           // named
    a.Ring += delegate(object s, EventArgs e) { Console.WriteLine("lambda"); }; // anon
    a.Ring += HandlerB;

    a.Trigger(); // prints A, lambda, B (multicast order)
  }
}

Wzorzec zgłaszania OnX

Używaj chronionej metody OnX do zgłaszania zdarzeń. Skopiuj delegata do zmiennej lokalnej i przed wywołaniem sprawdź, czy nie ma wartości null.

using System;

public class Ticker
{
  public event EventHandler Tick;

  protected virtual void OnTick()
  {
    EventHandler h = Tick;          // copy to local
    if (h != null) h(this, EventArgs.Empty);
  }

  public void RunOnce()
  {
    // do work...
    OnTick(); // raise via protected method
  }
}

public class Program
{
  static void Show(object s, EventArgs e) { Console.WriteLine("Tick!"); }

  public static void Main(string[] args)
  {
    Ticker t = new Ticker();
    t.Tick += Show;
    t.RunOnce();
  }
}

Wskazówki i pułapki dotyczące zdarzeń

Wskazówki:

  • Zawsze anuluj subskrypcję ( -= ), gdy subskrybent nie jest już potrzebny.
  • Procedury obsługi powinny być krótkie; długotrwałą pracę należy umieścić w kolejce.
  • Używaj EventArgs (lub podklasy), aby przekazywać dane.
  • Tylko wydawca powinien zgłaszać zdarzenie.

Rola słowa kluczowego event

Szybkie sprawdzenie: Które słowo kluczowe C# udostępnia delegata do subskrybowania i anulowania subskrypcji, jednocześnie uniemożliwiając kodowi zewnętrznemu bezpośrednie jego wywołanie?

Podsumowanie

Podsumowanie: Zadeklaruj zdarzenie, pozwól odbiorcom dołączać i odłączać obsługę, przekazuj dane za pomocą EventArgs i zgłaszaj zdarzenie przez chronioną metodę OnX.

Często zadawane pytania

Czy lekcja „Zdarzenia: publikowanie/subskrypcja, słowo kluczowe event” jest bezpłatna?

Tak — pełny tekst „Zdarzenia: publikowanie/subskrypcja, słowo kluczowe event” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 3 lekcji w sumie.

Co nauczysz się w „Zdarzenia: publikowanie/subskrypcja, słowo kluczowe event”?

Proszę używać zdarzeń w modelu publikowanie/subskrypcja: deklarować event, dodawać i usuwać handlery, przekazywać dane za pomocą EventArgs oraz zgłaszać zdarzenia według wzorca OnX. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C# Academy?

Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 3.

Ile czasu zajmuje lekcja „Zdarzenia: publikowanie/subskrypcja, słowo kluczowe event”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?

Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. delegate, Action/Func, domknięcia
  2. Zdarzenia: publikowanie/subskrypcja, słowo kluczowe event
  3. Wzorce zdarzeń i pułapki (wycieki pamięci)
← Powrót do C# Academy