Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Gli eventi sono, ad esempio i delegati, un meccanismo di associazione tardiva. Infatti, gli eventi sono basati sul supporto della lingua per i delegati.
Gli eventi sono un modo per trasmettere un oggetto (a tutti i componenti interessati nel sistema) che si è verificato un evento. Qualsiasi altro componente può sottoscrivere l'evento e ricevere una notifica quando viene generato un evento.
Probabilmente hai usato eventi in alcuni dei tuoi programmi. Molti sistemi grafici hanno un modello di evento per segnalare l'interazione dell'utente. Questi eventi segnalano lo spostamento del mouse, la pressione del pulsante e le interazioni simili. Questo è uno degli scenari più comuni, ma non l'unico scenario in cui vengono usati gli eventi.
È possibile definire eventi che devono essere generati per le classi. Una considerazione importante quando si lavora con gli eventi è che potrebbe non esserci alcun oggetto registrato per un determinato evento. È necessario scrivere il codice in modo che non generi eventi quando non sono configurati listener.
La sottoscrizione a un evento crea anche un collegamento tra due oggetti (la fonte dell'evento e la destinazione dell'evento). È necessario assicurarsi che il destinatario di eventi annulli la sottoscrizione all'origine evento quando non ci sono più interessi per gli eventi.
Obiettivi di progettazione per il supporto degli eventi
La progettazione del linguaggio per gli eventi è destinata a questi obiettivi:
- Consentire il minimo accoppiamento tra un'origine di eventi e una destinazione di eventi. Questi due componenti possono essere scritti da organizzazioni diverse e potrebbero anche essere aggiornati in pianificazioni diverse.
- Deve essere semplice sottoscrivere un evento e annullare la sottoscrizione dello stesso evento.
- Le fonti di eventi devono supportare più sottoscrittori di eventi. Deve inoltre supportare l'assenza di sottoscrittori di eventi associati.
È possibile notare che gli obiettivi per gli eventi sono simili agli obiettivi per i delegati. Ecco perché il supporto della lingua degli eventi è costruito sul supporto linguistico per delegati.
Supporto della lingua per gli eventi
La sintassi per definire gli eventi e per sottoscrivere o cancellarsi dagli eventi è un'estensione della sintassi per i delegati.
Usare la parola chiave event per definire un evento:
public event EventHandler<FileFoundArgs>? FileFound;
Il tipo dell'evento (EventHandler<FileListArgs> in questo esempio) deve essere un tipo delegato. Quando si dichiara un evento, è necessario seguire convenzioni. In genere, il tipo delegato di evento restituisce void. Le dichiarazioni di evento devono essere un verbo o una frase verbale. Usare il tempo passato quando l'evento segnala un evento che si è verificato. Usare un verbo teso presente (ad esempio, Closing) per segnalare un elemento che sta per accadere. Spesso, l'uso di un tensore presente indica che la classe supporta un certo tipo di comportamento di personalizzazione. Uno degli scenari più comuni consiste nel supportare l'annullamento. Ad esempio, un evento Closing può includere un argomento che indica se l'operazione di chiusura deve continuare o meno. Altri scenari consentono ai chiamanti di modificare il comportamento aggiornando le proprietà degli argomenti dell'evento. È possibile generare un evento per indicare un'azione successiva proposta che verrà eseguita da un algoritmo. Il gestore eventi potrebbe imporre un'azione diversa modificando le proprietà dell'argomento evento.
Quando si desidera attivare l'evento, chiamare i gestori degli eventi usando la sintassi di chiamata del delegato.
FileFound?.Invoke(this, new FileFoundArgs(file));
Come discusso nella sezione sui delegati , l'operatore ?. facilita il controllo per garantire che non si tenti di generare l'evento quando non ci sono sottoscrittori per quell'evento.
Puoi iscriverti a un evento utilizzando l'operatore +=:
var fileLister = new FileSearcher();
int filesFound = 0;
EventHandler<FileFoundArgs> onFileFound = (sender, eventArgs) =>
{
Console.WriteLine(eventArgs.FoundFile);
filesFound++;
};
fileLister.FileFound += onFileFound;
Il metodo del gestore ha in genere il prefisso 'On' seguito dal nome dell'evento, come illustrato nel codice precedente.
Annullare la sottoscrizione usando l'operatore -=:
fileLister.FileFound -= onFileFound;
È importante dichiarare una variabile locale per l'espressione che rappresenta il gestore eventi. Ciò garantisce che l'annullamento dell'iscrizione rimuova il gestore. Se invece è stato usato il corpo dell'espressione lambda, si sta tentando di rimuovere un gestore che non è mai stato associato, che non esegue alcuna operazione.
Nell'articolo successivo verranno fornite altre informazioni sui modelli di eventi tipici e sulle diverse varianti di questo esempio.