C#的委托和事件
委托:给我的第一感觉就是C++的函数指针,两者几乎一样。
不过他们有本质的区别:委托对象是一个对象,而函数指针是一个函数的入口地址
事件: 由两部分组成,一个事件发布者,一个事件接受者
事件发布者:
- 定义一个委托(delegate)
- 定义一个事件 (event)
- 定义触发事件的方法
事件接受者
- 定义事件处理方法
- 注册事件 (实例化一个委托并加入到事件中)
附图:
一个简单例子:
两个类:猫和老鼠, 都有叫的方法。 当猫叫的时候,触发老鼠叫
public class Cat : Animal{ public Cat (String name) : base(name) {} public Cat () : base() {} //声明一个委托,具体参数见附 public delegate void CatShoutEventHandle(Object sender, CatShoutEventArgs args); //声明一个事件 public event CatShoutEventHandle CatShout; public override void shout() { Console.Write( name + ":喵喵喵~\n"); if(CatShout != null) { CatShoutEventArgs e = new CatShoutEventArgs(); e.Name = this.name; CatShout(this, e); } }}
public class Mouse : Animal{ public Mouse () : base(){} public Mouse (String name) : base(name) {} public void run(Object sender, CatShoutEventArgs e) { Console.WriteLine(this.name+ ": " + e.Name + "猫来了,赶紧逃!"); }}
class MainClass{ public static void Main (string[] args) { Cat cat = new Cat("Tom"); Mouse mouseJack = new Mouse("Jack"); Mouse mouseJerry = new Mouse("Jerry"); //注册事件 cat.CatShout += new Cat.CatShoutEventHandle(mouseJack.run); cat.CatShout += new Cat.CatShoutEventHandle(mouseJerry.run); cat.shout (); }}
附:
Observer(观察者)设计模式:
Observer设计模式是为了定义对象间的一种一对多的依赖关系,以便于当一个对象的状态
改变时,其他依赖于它的对象会被自动告知并更新。Observer模式是一种松耦合的设计模式。.Net Framework中的委托与事件
.Net Framework的编码规范:
委托类型的名称都应该以EventHandler结束。 委托的原型定义:有一个void返回值,并接受两个输入参数:一个Object 类型,一个 EventArgs类型(或继承自EventArgs)。 许多事件处理函数都是这样的事件的命名为 委托去掉 EventHandler之后剩余的部分。
继承自EventArgs的类型应该以EventArgs结尾。再做一下说明:委托声明原型中的Object类型的参数代表了Subject,
也就是监视对象,回调函数可以通过它访问触发事件的对象。 EventArgs 对象包含了Observer所感兴趣的数据