面接でよく聞かれるのですが、コミッションとイベントの関係や違いは何ですか?まだよく理解できていないので、以下にまとめてみます。
興味深い要件から始めます。登場人物は猫、ネズミ、飼い主の3人で、猫が鳴くとネズミが走り出し、飼い主は眠りから目覚めます。
次のコード:
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 }
デモを通じて要約できます:
1. 以下に示すように、イベントを定義して使用するプロセス:
2.イベントパラメータを定義するには、EventArgs を継承する必要があります。イベントを定義するには、public event EventHandler
3 を使用します。それを実現するために、その要点を以下にまとめます。
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 }
を実装すると、実際には連鎖した委任呼び出しであることがわかります。 3 つのメソッドがチェーン デリゲートに追加され、呼び出されると順番に実行されます。
イベントと委任の関係を完全に理解するために、以下に示す EventHandler のソース コードを確認します。
上の写真の赤いマークが見えますか?したがって、イベントは委任に基づいて実装されます。要約すると:
連絡先:
1. イベントは委任に基づいて実装されます。これは一般に次のように理解されます。イベントは特別な種類の委任です。特別なのは、2 つのパラメーター (event.ソースおよびイベント パラメーター) 戻り値のないデリゲート。
2、イベントのサブスクライバーがイベントをサブスクライブすると、基本的にイベント処理メソッドが委任チェーンに追加されます イベントがトリガーされると、委任チェーン内のすべてのイベント処理メソッドが呼び出されます。 。
違い:
デリゲートの本質はカスタム型 (クラス) ですが、イベントの本質は特別なデリゲート インスタンス (オブジェクト) です。
以上が委任とイベントの関係と違いを要約するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。