概念

事件(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;//event就是一个带有特殊签名的委托,在这里相当于public 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)//避免Event为空
catComeEvent();
}
public event Action catComeEvent;
}
class Mouse
{
private string color;
private string name;
//在mouse实例化时就把它的逃跑方法注册进Cat里
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