C# Academy · Lektion

Hændelser: publicering/abonnering, nøgleordet event

Brug hændelser til publicering og abonnering: deklarér en hændelse, tilføj og fjern handlere, send data via EventArgs, og udløs hændelser med OnX-mønstret.

Lektion 2 af 38 trin

Hændelser: publicering/abonnering, nøgleordet event er en gratis C# Academy-lektion på CoddyKit. Dette er lektion 2 af 3. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i C# Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C# Academy-kurset indeholder 3 lektioner i alt.

Oversigt over hændelser

Mål: Udgiv data og abonnér på dem med hændelser.

  • Erklær en hændelse på udgiveren
  • Abonnér med +=, og afmeld med -=
  • Udløs hændelsen sikkert i udgiveren
  • Send data med EventArgs

Grundlæggende brug af hændelser

Eksponér en hændelse, og lad lyttere tilknytte og frakoble sig. Kun udgiveren kalder den.

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
  }
}

Hændelse med data

Brug EventArgs (eller EventHandler<TEventArgs>) til at sende nyttige data til abonnenter.

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;
  }
}

Multicast og lambdaudtryk

Hændelser er multicast: Flere håndteringer køres i abonnementsrækkefølge. Brug navngivne eller anonyme håndteringer.

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)
  }
}

Mønsteret til at udløse OnX

Brug en beskyttet OnX-metode til at udløse hændelser. Kopiér delegaten til en lokal variabel, og kontrollér, at den ikke er null, før du kalder den.

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();
  }
}

Tips og faldgruber ved hændelser

Tips:

  • Afmeld altid abonnementet ( -= ), når en abonnent ikke længere er nødvendig.
  • Hold håndteringer korte; længerevarende arbejde bør lægges i kø.
  • Brug EventArgs (eller en underklasse) til at sende data.
  • Kun udgiveren bør udløse hændelsen.

Rollen for nøgleordet event

Hurtigt tjek: Hvilket C#-nøgleord eksponerer en delegat til abonnement og afmelding, samtidig med at det forhindrer ekstern kode i at kalde den direkte?

Opsummering

Opsummering: Erklær en hændelse, lad lyttere tilknytte og frakoble sig, send data med EventArgs, og udløs hændelsen via en beskyttet OnX-metode.

Gratis at komme i gang

Lær C# med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
93
Lektioner
346

Ofte stillede spørgsmål

Er lektionen “Hændelser: publicering/abonnering, nøgleordet event” gratis?

Ja — hele teksten til “Hændelser: publicering/abonnering, nøgleordet event” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af C# Academy-kurset, skal du opgradere til CoddyKit PRO. C# Academy-kurset indeholder 3 lektioner i alt.

Hvad lærer jeg i “Hændelser: publicering/abonnering, nøgleordet event”?

Brug hændelser til publicering og abonnering: deklarér en hændelse, tilføj og fjern handlere, send data via EventArgs, og udløs hændelser med OnX-mønstret. Du øver dig i C# Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på C# Academy?

Der kræves ingen tidligere erfaring. C# Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 3.

Hvor lang tid tager lektionen “Hændelser: publicering/abonnering, nøgleordet event”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne C# Academy-lektion?

Ja. Alle C# Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. delegate, Action/Func, closures
  2. Hændelser: publicering/abonnering, nøgleordet event
  3. Hændelsesmønstre og faldgruber (hukommelseslækager)
← Tilbage til C# Academy