Maison >développement back-end >Tutoriel C#.Net >Résumer le lien et la différence entre la délégation et les événements
Lors des entretiens, on nous demande souvent, quel est le lien et la différence entre les commandes et les événements ? Je ne l'ai jamais complètement compris auparavant, je vais donc le résumer ci-dessous.
Commencez par une exigence intéressante. Il y a trois personnages, le chat, la souris et le propriétaire. Lorsque le chat miaule, la souris commence à s'enfuir et le propriétaire se réveille de son sommeil.
comme suit :
1 namespace ConsoleApplication4 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 Cat cat = new Cat("猫"); 8 Mouse mouse1 = new Mouse("老鼠", cat); 9 Master master = new Master("张三", cat);10 //猫叫,通知所有订阅者11 cat.CatCry();12 13 Console.ReadKey();14 }15 }16 17 #region 猫18 public class Cat19 {20 private string name;21 22 //声明事件23 public event EventHandler<CatCryEventArgs> CatCryEvent;24 25 public Cat(string name)26 {27 this.name = name;28 }29 30 public void CatCry()31 {32 //声明事件参数33 CatCryEventArgs args = new CatCryEventArgs(name);34 Console.WriteLine(args);35 36 //触发事件37 CatCryEvent(this, args);38 }39 }40 41 /// <summary>42 /// 事件参数43 /// </summary>44 public class CatCryEventArgs : EventArgs45 {46 private string catName;47 48 public CatCryEventArgs(string catName)49 : base()50 {51 this.catName = catName;52 }53 54 public override string ToString()55 {56 return string.Format("{0}叫了", catName);57 }58 }59 #endregion60 61 #region 老鼠62 public class Mouse63 {64 private string name;65 public Mouse(string name, Cat cat)66 {67 this.name = name;68 cat.CatCryEvent += CatCryEventHandler;//本质上就是往委托链中添加一个方法69 }70 71 //事件处理程序72 private void CatCryEventHandler(object sender, CatCryEventArgs e)73 {74 Console.WriteLine("{0}逃走了:我勒个去,赶紧跑啊!", name);75 }76 }77 #endregion78 79 #region 主人80 public class Master81 {82 private string name;83 public Master(string name, Cat cat)84 {85 this.name = name;86 cat.CatCryEvent += CatCryEventHandler;//本质上就是往委托链中添加一个方法87 }88 89 //事件处理程序90 private void CatCryEventHandler(object sender, CatCryEventArgs e)91 {92 Console.WriteLine("{0}醒了:我勒个去,叫个锤子!", name);93 }94 }95 #endregion96 97 }
Cela peut être résumé via une démo :
1. Le processus de définition et d'utilisation des événements est le suivant :
2 Pour définir les paramètres d'un événement, vous devez hériter de EventArgs. Pour définir des événements, utilisez public. event EventHandler
3. L'événement utilise le mode observateur, avec publication, abonnement et notification. l’essentiel sera résumé ci-dessous.
1 namespace ConsoleApplication5 2 { 3 //声明委托 4 public delegate void Del1(); 5 6 class Program 7 { 8 static void Main(string[] args) 9 {10 //创建委托链(链式委托)11 Del1 del1 = () => Console.WriteLine("猫叫了");12 del1 += () => Console.WriteLine("老鼠逃走了:我勒个去,赶紧跑啊!");13 del1 += () => Console.WriteLine("主人醒了:我勒个去,叫个锤子!");14 15 //调用委托16 del1();17 18 Console.ReadKey();19 }20 21 }22 }
On voit qu'il s'agit en fait d'un appel de délégué enchaîné. Trois méthodes sont ajoutées au délégué de chaîne, qui sont exécutées en séquence lorsqu'elles sont appelées.
Afin de bien comprendre la relation entre les événements et les délégués, examinons le code source d'EventHandler, comme indiqué ci-dessous.
Vous voyez la marque rouge sur l'image ci-dessus ? Par conséquent, les événements sont mis en œuvre sur la base de la délégation. Pour résumer :
Contact :
1. Les événements sont mis en œuvre sur la base d'une délégation, qui peut être comprise communément comme : Les événements sont un type particulier de délégation, et le spécial. le problème est qu'il définit un délégué avec deux paramètres (source d'événement et paramètres d'événement) et aucune valeur de retour.
2, Lorsqu'un abonné à un événement s'abonne à un événement, il ajoute essentiellement la méthode de traitement de l'événement à la chaîne de délégation , lorsque Lorsqu'un événement est déclenché, toutes les méthodes de gestion des événements de la chaîne de délégation seront appelées.
Différence :
L'essence d'un délégué est un type personnalisé (classe), tandis que l'essence d'un événement est une instance de délégué spéciale (objet) .
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!