要想技術有所提高,就是把有些問題真正的弄懂弄明白,我從事C#開發兩年了,一直對事件委托等概念一知半解,有時候博客園上看看別的大牛的文章,看看懂了就過去了,時間長了又忘了,真正理解還是要自己動手弄些例子,搞懂這些概念,我寫文章也是出於這個目的,希望和大家一塊學習進步。
我還是拿經典的例子來說明:貓叫,老鼠跑,主人吵醒了。
我們用事件的方法來實現,把貓叫作為觸發事件的方法,綁定在這個事件上的方法都會被觸發。
先用網上大家的例子:
public class Cat { /// <summary> /// 貓叫方法 /// </summary> public void Miao() { Console.WriteLine("喵喵喵喵喵喵"); if (OnMiao != null) OnMiao(this,EventArgs.Empty); } /// <summary> /// 貓叫事件 /// </summary> public event EventHandler OnMiao; }
public class Master { public Master() { } /// <summary> /// 主人被叫醒了 /// </summary> public void Wake() { Console.WriteLine("死貓叫啥叫,吵我睡覺!!!"); } }
public class Mouse { public Mouse() { } /// <summary> /// 老鼠跑 /// </summary> public void Run() { Console.WriteLine("貓來了,快跑!!!!"); } }
客戶端代碼
class Program { static void Main(string[] args) { Cat cat = new Cat(); Mouse mouse = new Mouse(); Master master = new Master(); cat.OnMiao += delegate { mouse.Run(); }; cat.OnMiao += delegate { master.Wake(); }; cat.Miao(); } }
這個辦法可以實現,貓叫,老鼠跑,主人醒。但如果我想拓展下呢,主人叫有好幾只貓,每只貓叫的聲音都不一樣,主人吵醒後要知道哪只貓把他吵醒了。
現在我們改寫Cat類
/// <summary> /// 我們自定義事件數據 /// </summary> public class CatEventArgs : EventArgs { public string CatName { get; set; } } public class Cat { /// <summary> /// 定義事件委托 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public delegate void CatEventHandler(object sender, CatEventArgs e); public Cat() { } /// <summary> /// 貓叫 /// </summary> public void Miao() { Console.WriteLine("喵喵喵喵喵喵"); if (OnMiao != null) { CatEventArgs catEventArgs = new CatEventArgs(); catEventArgs.CatName = "Tom"; OnMiao(this, catEventArgs); } } /// <summary> /// 貓叫完成事件 /// </summary> public event CatEventHandler OnMiao; }
客戶端代碼
class Program { static void Main(string[] args) { Cat cat = new Cat(); Mouse mouse = new Mouse(); Master master = new Master(); cat.OnMiao += cat_OnMiao; cat.OnMiao += delegate { master.Wake(); }; cat.Miao(); } static void cat_OnMiao(object sender, CatEventArgs e) { Console.WriteLine(string.Format("{0}貓在叫",e.CatName)); } }
這樣就知道哪只貓叫了,關鍵是我們自定義了CatEventArgs,這個類繼承了EventArgs,可以傳遞事件信息,自定義信息,並且自定義事件委托public delegate void CatEventHandler(object sender, CatEventArgs e);
自己的小例子,大牛勿笑;新的一年祝大家心想事成,更上一層樓
--每天有點進步