Condividi tramite


Procedura: implementare eventi nella classe

Aggiornamento: novembre 2007

Nelle procedure descritte di seguito viene illustrata l'implementazione di un evento in una classe. Nella prima procedura viene implementato un evento a cui non è associato alcun dato e vengono utilizzate le classi System.EventArgs e System.EventHandler per i dati dell'evento e il gestore delegato. Nella seconda procedura viene implementato un evento con dati personalizzati e vengono definite classi personalizzate relative ai dati dell'evento e al gestore delegato dell'evento.

Per un esempio in cui venga illustrata in maniera completa la generazione e la gestione degli eventi, vedere Procedura: generare e utilizzare eventi.

Per implementare un evento senza dati specifici dell'evento

  1. Definire un membro di evento pubblico nella classe. Impostare il tipo del membro di evento su un delegato System.EventHandler.

    public class Countdown 
    {
        ...
        public event EventHandler CountdownCompleted;   
    }
    
    Public Class Countdown
        ...
        Public Event CountdownCompleted As EventHandler
    End Class
    
  2. Aggiungere alla propria classe un metodo protetto che generi l'evento. Denominare il metodo OnEventName. Generare l'evento all'interno del metodo.

    public class Countdown 
    {
        ...
        public event EventHandler CountdownCompleted;   
        protected virtual void OnCountdownCompleted(EventArgs e)    {        if (CountdownCompleted != null)            CountdownCompleted(this, e);    }
    }
    
    Public Class Countdown
       ...
       Public Event CountdownCompleted As EventHandler
       Protected Overridable Sub OnCountdownCompleted(e As EventArgs)      RaiseEvent CountdownCompleted(Me, e)   End Sub
    End Class
    
  3. Determinare quando generare l'evento nella classe. Chiamare OnEventName per generare l'evento.

    public class Countdown 
    {
        ...
        public void Decrement
        {
            internalCounter = internalCounter - 1;
            if (internalCounter == 0)
                OnCountdownCompleted(new EventArgs());
        }
    }
    
    Public Class Countdown
        ...
        Public Function Decrement
            InternalCounter = internalCounter - 1
            If internalCounter = 0
                OnCountdownComplete(New EventArgs())
            End If
        End Function
    End Class
    

Per implementare un evento con dati specifici dell'evento

  1. Definire una classe che fornisce i dati per l'evento. Denominare la classe EventNameArgs, derivare la classe da System.EventArgs e aggiungere gli eventuali membri specifici dell'evento.

    public class AlarmEventArgs : EventArgs 
    {
       private readonly int nrings = 0;
       private readonly bool snoozePressed = false;
    
       //Constructor.
       public AlarmEventArgs(bool snoozePressed, int nrings) 
       {
          this.snoozePressed = snoozePressed;
          this.nrings = nrings;
       }
    
       //Properties.
       public string AlarmText {  
          ...
       }
       public int NumRings {
          ...
       }
       public bool SnoozePressed{
          ...
       }
    }
    
    Public Class AlarmEventArgs
       Inherits EventArgs
       Private nrings As Integer = 0
       Private _snoozePressed As Boolean = False
    
       'Constructor.
       Public Sub New(ByVal snoozePressed As Boolean, ByVal nrings As Integer) 
          Me.snoozePressed = snoozePressed
          Me.nrings = nrings
       End Sub
    
       'Properties.
       Public ReadOnly Property AlarmText() As String
          ...
       End Property 
    
       Public ReadOnly Property NumRings() As Integer
          ...
       End Property 
    
       Public ReadOnly Property SnoozePressed() As Boolean
          ...
       End Property
    End Class
    
  2. Dichiarare un delegato per l'evento. Denominare il delegato EventNameEventHandler.

    public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
    
    Public Delegate Sub AlarmEventHandler(sender As Object, e As AlarmEventArgs)
    
  3. Definire un membro di evento pubblico denominato EventName nella classe. Impostare il tipo del membro di evento sul tipo di delegato dell'evento.

    public class AlarmClock 
    {
        ...
        public event AlarmEventHandler Alarm;
    }
    
    Public Class AlarmClock
        ...
        Public Event Alarm As AlarmEventHandler
    End Class
    
  4. Definire nella classe un metodo protetto che generi l'evento. Denominare il metodo OnEventName. Generare l'evento all'interno del metodo.

    public class AlarmClock 
    {
        ...
        public event AlarmHandler Alarm;
        protected virtual void OnAlarm(AlarmEventArgs e)    {      if (Alarm != null)           Alarm(this, e);     }
    }
    
    Public Class AlarmClock
        ...
        Public Event Alarm As AlarmEventHandler
        Protected Overridable Sub OnAlarm(e As AlarmEventArgs)        RaiseEvent Alarm(Me, e)    End Sub
    End Class
    
  5. Determinare quando generare l'evento nella classe. Chiamare OnEventName per generare l'evento e passare i dati specifici dell'evento mediante EventNameEventArgs.

    Public Class AlarmClock
    {
        ...
        public void Start()
        {
            ...
            System.Threading.Thread.Sleep(300);
            AlarmEventArgs e = new AlarmEventArgs(false, 0);
            OnAlarm(e);
        }
    }
    
    Public Class AlarmClock
        ...
        Public Function Start
            ...
            System.Threading.Thread.Sleep(300)
            Dim e As AlarmEventArgs = New AlarmEventArgs(False, 0)
            OnAlarm(e)
        End Function
    End Class
    

Vedere anche

Attività

Procedura: generare e utilizzare eventi

Concetti

Eventi e delegati

Generazione di un evento

Altre risorse

Gestione e generazione di eventi