要想技术有所提高,就是把有些问题真正的弄懂弄明白,我从事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);
自己的小例子,大牛勿笑;新的一年祝大家心想事成,更上一层楼
--每天有点进步