概念
事件(Event)基于委托,为委托提供了一个发布/订阅机制,我们可以说事件是一种具有特殊签名的委托。
什么是事件?
事件(Event)是类或对象向其他类或对象通知发生的事情的一种特殊签名的委托
事件的声明
1
| public event 委托类型(delegate、Action、Func) 事件名
|
事件使用event关键词来声明,他的声明类值是一个委托类型
通常事件的命名,以名字+Event作为他的名称,在编码中尽量使用规范命名,增加代码的可读性。
为了更容易理解事件,我们还是以前面的动物的示例来说明,有三只动物,猫(名叫Tom),还有两只老鼠(Jerry和Jack),当猫叫的时候,触发事件(CatShout),然后两只老鼠开始逃跑(MouseRun)。接下来用代码来实现。(设计模式-观察者模式)
例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| namespace Observer_Pattern { class OberverTest { delegate void MyDarling(); event MyDarling myDarlingEvent; static void Main(string[] args) { OberverTest oberverTest = new OberverTest(); oberverTest.myDarlingEvent = MyTset; oberverTest.myDarlingEvent(); } static void MyTset() { Console.WriteLine("nununu"); } } }
|
猫和老鼠
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| class Cat { private string color; private string name; public Cat(string color,string name) { this.color = color; this.name = name; } public void CatComing() { Console.WriteLine(color + "颜色的猫" + name + "来了哦"); if(catComeEvent!=null) catComeEvent(); } public event Action catComeEvent; } class Mouse { private string color; private string name; public Mouse(string color,string name,Cat cat) { this.color = color; this.name = name; cat.catComeEvent += this.RunAway; } public void RunAway() { Console.WriteLine(color + "颜色的老鼠" + name + "要逃跑"); }
} class OberverTest { static void Main(string[] args) { Cat cat = new Cat("Yello", "Tom"); Mouse mouse1 = new Mouse("Black", "Jack",cat); Mouse mouse2 = new Mouse("Blue", "Jerry",cat); cat.CatComing(); } }
|
把观察者自己的Method注册进发布者的Events里面,可以在构造函数的时候注册(多数情况),也可以在自己的一些方法里面注册
发布者要有一个方法(Cat Coming),把自己的Event接受的这些方法启动了,并且注意event不要为null