温故知新(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 + "跑了!!!");        }    }}