从一个风趣的需求入手。有三个角色,猫,老鼠和主人,当猫叫的时刻,老鼠最先逃窜,主人则从睡梦中惊醒。
运用事宜完成
以下代码:
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 }
经由过程demo能够总结:
1,定义和运用事宜的流程,以下图:
2,定义事宜参数要继续EventArgs,定义事宜运用public event EventHandler<CatCryEventArgs> CatCryEvent;
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 }
能够看出,实在就是一个链式托付的挪用。向链式托付增加了三个要领,挪用的时刻顺次实行。
事宜和托付
为了弄清完全弄清事宜和托付的关联,我们查看下EventHandler的源代码,以下图。
看到上图的赤色标记了吗?所以,事宜是基于托付完成的。总结一下:
联络:
1,事宜是基于托付完成的,能够浅显地理解为:事宜是一种特别的托付,特别的处所在于它定义的是一个有两个参数(事宜源和事宜参数)没有返回值的托付。
2,当事宜的定阅者定阅事宜时,实质上是将事宜的处置惩罚要领加入到托付链中,当事宜触发时,托付链中的一切事宜处置惩罚要领都会被挪用。
区分:
托付实质是一种自定义范例(class),而事宜实质是一个特别的托付实例(对象)。
以上就是总结托付和事宜的联络和区分的细致内容,更多请关注ki4网别的相干文章!