温故知新(8)委托(二)事件 event
来源:互联网 发布:c语言define的用法 编辑:程序博客网 时间:2024/06/05 20:37
事件(event)基于委托,为委托提供了一个发布/订阅机制,我们可以说事件是一种具有特殊签名的委托。
什么是事件?事件(Event)是类或对象向其他类或对象通知发生的事情的一种特殊签名的委托.
事件的声明
public event 委托类型 事件名;
事件使用event关键词来声明,他的返回类值是一个委托类型。
通常事件的命名,以名字+Event 作为他的名称,在编码中尽量使用规范命名,增加代码可读性。
事件与委托的联系和区别
事件是一种特殊的委托,或者说是受限制的委托,是委托一种特殊应用,只能施加+=,-=操作符。二者本质上是一个东西。
-event ActionHandler Tick; // 编译成创建一个私有的委托示例, 和施加在其上的add, remove方法.
-event只允许用add, remove方法来操作,这导致了它不允许在类的外部被直接触发,只能在类的内部适合的时机触发。委托可以在外部被触发,但是别这么用。
-使用中,委托常用来表达回调,事件表达外发的接口。
-委托和事件支持静态方法和成员方法, delegate(void * pthis, f_ptr), 支持静态返方法时, pthis传null.支持成员方法时, pthis传被通知的对象.
-委托对象里的三个重要字段是, pthis, f_ptr, pnext, 也就是被通知对象引用, 函数指针/地址, 委托链表的下一个委托节点.
namespace Test1{ class Program { static void Main(string[] args) { MyClass myClass = new MyClass(); myClass.myEvent += GetName; myClass.Fun("xxxxxx"); //匿名方法 myClass.myEvent += delegate(string name) { Console.WriteLine(name); }; myClass.Fun("zzzzzz"); Console.ReadKey(); } static void GetName(string name) { Console.WriteLine(name); } } public delegate void MyDelegate(string name); class MyClass { public event MyDelegate myEvent; public void Fun(string name) { if (myEvent != null) myEvent(name); } }}
设计模式-观察者模式
1:如果没有使用委托方法,则设计模式=>猫的状态发生改变,在Cat中调用了观察这的方法,当观察者发生了改变的时候,需要同时修改被观察者的代码。2:如果使用委托方法,则设计模式=>猫的状态没有发生改变,当观察者发生了改变的时候,只需要把发生改变的对象+到委托中即可,方便添加减少。
namespace Test1{ class Program { static void Main(string[] args) { Cat cat = new Cat("黑色","龙猫"); Mouse mouse1 = new Mouse("黑色","米奇"); Mouse mouse2 = new Mouse("黄色", "拉克"); Mouse mouse3 = new Mouse("白色","琪琪"); cat.CatCallEvent += mouse1.MouseRun; cat.CatCallEvent -= mouse2.MouseRun; cat.CatCallEvent += mouse3.MouseRun; cat.CatCall(); Console.ReadKey(); } } class Cat { public delegate void CatCallEventHandler(); public event CatCallEventHandler CatCallEvent; public string catName; public string catColor { get; set; } public Cat(string color,string name) { catName = name; catColor = color; } public void CatCall() { Console.WriteLine(catColor + "的猫," + catName + "来了!!!"); if (CatCallEvent != null) CatCallEvent(); } } class Mouse { public string mouseName; public string mouseColor { get; set; } public Mouse(string color,string name) { mouseColor = color; mouseName = name; } public void MouseRun() { Console.WriteLine(mouseColor + "的老鼠," + mouseName + "跑了!!!"); } }}
阅读全文
0 0
- 温故知新(8)委托(二)事件 event
- C#:委托(delegate)和事件 (event)
- 委托(Delegate) 和 事件(Event)
- JS事件委托(event delegation)
- 初学事件Event(二)
- 委托和事件(二)--委托详解
- 委托和事件(二)
- C#委托(delegate)与事件(event)
- C#委托(delegate)与事件(event)
- C#委托(delegate)与事件(event)
- c# event(事件)和delegate(委托)
- C#之委托(delegate)与事件(event)
- c#中的delegate(委托)和event(事件)
- c#中的delegate(委托)和event(事件)
- c#中的delegate(委托)和event(事件)
- c#中的delegate(委托)和event(事件)
- c#中的delegate(委托)和event(事件)
- c#中的delegate(委托)和event(事件)
- ARM—HEX转换工具——keystone-engine
- 头文件模板
- 【Centos】7.5版本安装传输工具rz和sz
- 总结遇到的Python的坑
- 【演讲实录】分布式数据库海量数据存储和实时查询实现与应用
- 温故知新(8)委托(二)事件 event
- TCP 和IP的区别
- eclipse中Data Source Explorer的使用方法
- tiny-yolo训练测试(coco训练集混合自己的voc训练集)--20170829
- mybatis传入参数为0被误认为是空字符串的解决方法
- springMVC和其注解方式
- 如何消除重复代码
- UVA.10491 Cows and Cars (概率)
- thymleaf #lists #dates 用法