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.
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
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.
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
- delegate, Action/Func, closures
- Hændelser: publicering/abonnering, nøgleordet event
- Hændelsesmønstre og faldgruber (hukommelseslækager)