Événement C#
Événement Fondamentalement, il s'agit d'une opération utilisateur, telle qu'une pression sur une touche, un clic, un mouvement de la souris, etc., ou une occurrence, telle qu'un système généré notification. Les applications doivent répondre aux événements lorsqu'ils se produisent. Par exemple, les interruptions. Les événements sont utilisés pour la communication inter-processus.
Utilisation de délégués via des événements
Les événements sont déclarés et générés dans une classe, et sont associés à des gestionnaires d'événements en utilisant des délégués dans la même classe ou dans d'autres classes. La classe contenant l'événement est utilisée pour publier l'événement. C'est ce qu'on appelle la classe éditeur. Les autres classes qui acceptent cet événement sont appelées classes abonnées . Les événements utilisent le modèle éditeur-abonné .
Un éditeur est un objet qui contient des définitions d'événements et de délégués. La connexion entre les événements et les délégués est également définie dans cet objet. Les objets de la classe éditeur appellent cet événement et notifient les autres objets.
Un abonné est un objet qui accepte les événements et fournit des gestionnaires d'événements. Le délégué de la classe éditeur appelle les méthodes (gestionnaires d’événements) de la classe abonné.
Déclarer un événement (Event)
Pour déclarer un événement à l'intérieur d'une classe, vous devez d'abord déclarer le type délégué de l'événement. Par exemple :
public delegate void BoilerLogHandler(string status);
Ensuite, déclarez l'événement lui-même, en utilisant le mot-clé event :
// 基于上面的委托定义事件 public event BoilerLogHandler BoilerEventLog;
Le code ci-dessus définit un délégué nommé BoilerLogHandler et un événement nommé BoilerEventLog qui appellera le délégué une fois généré.
Exemple 1
using System; namespace SimpleEvent { using System; public class EventTest { private int value; public delegate void NumManipulationHandler(); public event NumManipulationHandler ChangeNum; protected virtual void OnNumChanged() { if (ChangeNum != null) { ChangeNum(); } else { Console.WriteLine("Event fired!"); } } public EventTest(int n ) { SetValue(n); } public void SetValue(int n) { if (value != n) { value = n; OnNumChanged(); } } } public class MainClass { public static void Main() { EventTest e = new EventTest(5); e.SetValue(7); e.SetValue(11); Console.ReadKey(); } } }
Lorsque le code ci-dessus est compilé et exécuté, il produira les résultats suivants :
Event Fired! Event Fired! Event Fired!
Exemple 2
Cet exemple fournit un Application simple pour le dépannage du système de chaudière à eau chaude. Lorsqu'un ingénieur de maintenance inspecte la chaudière, la température et la pression de la chaudière sont automatiquement enregistrées dans le fichier journal avec les notes de l'ingénieur de maintenance.
using System; using System.IO; namespace BoilerEventAppl { // boiler 类 class Boiler { private int temp; private int pressure; public Boiler(int t, int p) { temp = t; pressure = p; } public int getTemp() { return temp; } public int getPressure() { return pressure; } } // 事件发布器 class DelegateBoilerEvent { public delegate void BoilerLogHandler(string status); // 基于上面的委托定义事件 public event BoilerLogHandler BoilerEventLog; public void LogProcess() { string remarks = "O. K"; Boiler b = new Boiler(100, 12); int t = b.getTemp(); int p = b.getPressure(); if(t > 150 || t < 80 || p < 12 || p > 15) { remarks = "Need Maintenance"; } OnBoilerEventLog("Logging Info:\n"); OnBoilerEventLog("Temparature " + t + "\nPressure: " + p); OnBoilerEventLog("\nMessage: " + remarks); } protected void OnBoilerEventLog(string message) { if (BoilerEventLog != null) { BoilerEventLog(message); } } } // 该类保留写入日志文件的条款 class BoilerInfoLogger { FileStream fs; StreamWriter sw; public BoilerInfoLogger(string filename) { fs = new FileStream(filename, FileMode.Append, FileAccess.Write); sw = new StreamWriter(fs); } public void Logger(string info) { sw.WriteLine(info); } public void Close() { sw.Close(); fs.Close(); } } // 事件订阅器 public class RecordBoilerInfo { static void Logger(string info) { Console.WriteLine(info); }//end of Logger static void Main(string[] args) { BoilerInfoLogger filelog = new BoilerInfoLogger("e:\boiler.txt"); DelegateBoilerEvent boilerEvent = new DelegateBoilerEvent(); boilerEvent.BoilerEventLog += new DelegateBoilerEvent.BoilerLogHandler(Logger); boilerEvent.BoilerEventLog += new DelegateBoilerEvent.BoilerLogHandler(filelog.Logger); boilerEvent.LogProcess(); Console.ReadLine(); filelog.Close(); }//end of main }//end of RecordBoilerInfo }
Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants :
Logging info: Temperature 100 Pressure 12 Message: O. K