C# Academy · Lezione

Eventi: pubblicazione/sottoscrizione, parola chiave event

Imparate il modello pubblicazione/sottoscrizione con gli eventi: dichiarate un event, aggiungete e rimuovete gestori, passate dati tramite EventArgs e sollevate l’evento secondo il pattern OnX.

Lezione 2 di 38 passaggi

Eventi: pubblicazione/sottoscrizione, parola chiave event è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 2 di 3. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 3 lezioni in totale.

Panoramica sugli eventi

Obiettivo: implementare il modello pubblicazione/sottoscrizione con gli eventi.

  • Dichiari un event nel produttore
  • Effettui la sottoscrizione con += e la annulli con -=
  • Generi l'evento in modo sicuro nel produttore
  • Passi i dati utilizzando EventArgs

Utilizzo di base degli eventi

Esponga un event e consenta agli ascoltatori di collegarsi e scollegarsi. Solo il produttore può invocarlo.

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

Evento con dati

Utilizzi EventArgs (o EventHandler<TEventArgs>) per passare dati utili ai sottoscrittori.

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 e lambda

Gli eventi sono multicast: più gestori vengono eseguiti nell'ordine di sottoscrizione. Utilizzi gestori denominati o anonimi.

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

Pattern OnX per generare eventi

Utilizzi un metodo OnX protetto per generare gli eventi. Copi il delegato in una variabile locale e verifichi che non sia null prima di invocarlo.

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

Suggerimenti e insidie degli eventi

Suggerimenti:

  • Annulli sempre la sottoscrizione ( -= ) quando un sottoscrittore non è più necessario.
  • Mantenga i gestori brevi; le operazioni lunghe devono essere accodate.
  • Utilizzi EventArgs (o una sottoclasse) per passare i dati.
  • Solo il produttore dovrebbe generare l'evento.

Ruolo della parola chiave event

Verifica rapida: quale parola chiave di C# espone un delegato per la sottoscrizione e la cancellazione della sottoscrizione, impedendo al codice esterno di invocarlo direttamente?

Riepilogo

Riepilogo: dichiari un event, consenta agli ascoltatori di collegarsi e scollegarsi, passi i dati con EventArgs e generi l'evento tramite un metodo OnX protetto.

Gratis per iniziare

Impara C# con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
93
Lezioni
346

Domande Frequenti

La lezione «Eventi: pubblicazione/sottoscrizione, parola chiave event» è gratuita?

Sì — il testo completo di «Eventi: pubblicazione/sottoscrizione, parola chiave event» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 3 lezioni in totale.

Cosa imparerò in «Eventi: pubblicazione/sottoscrizione, parola chiave event»?

Imparate il modello pubblicazione/sottoscrizione con gli eventi: dichiarate un event, aggiungete e rimuovete gestori, passate dati tramite EventArgs e sollevate l’evento secondo il pattern OnX. Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C# Academy?

Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 3.

Quanto tempo richiede la lezione «Eventi: pubblicazione/sottoscrizione, parola chiave event»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C# Academy?

Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. delegate, Action/Func, closure
  2. Eventi: pubblicazione/sottoscrizione, parola chiave event
  3. Pattern degli eventi, problemi comuni (memory leak)
← Torna a C# Academy