前言
- 委托类型的变量可以作为类的成员,也可以作为方法的局部变量
public event MyDelegate myDelegate
- 在一个委托类型的变量前面加上event,就声明了一个事件
盲点
- 事件和委托同时在Test类里面被声明为public
- 但是事件的调用只能在Test类中,在该类外面就只能+=或者-=
- 而委托则可以在任何类中进行调用
区别点
- 事件只能作为类的成员被声明
- 由于事件不是类型,我们不能使用对象创建表达式来创建它的对象
- 由于是成员,必须声明在类或结构中
- 不能在一段可执行代码中声明事件
- 事件成员被隐式自动初始化为null
发布者类——猫
// 发布者类
class Cat
{
private string color;
private string name;
public Cat(string color, string name)
{
this.name = name;
this.color = color;
}
public void CatComing()
{
Console.WriteLine("{0}的猫咪{1}进来了", color, name);
runEvent();
}
private event Action runEvent; //我不想把事件暴露出去
//public static event Action runEvent; //也可以设置成静态成员
public void AddRun(Action method) //提供一个方法添加事件
{
runEvent += method;
}
}
订阅者类——老鼠
// 订阅者类
class Mouse
{
private string name;
public Mouse(string name)
{
this.name = name;
}
public void Run()
{
Console.WriteLine("老鼠{0}正在逃跑中....",name);
}
}
触发事件
class Program
{
static void Main(string[] args)
{
//Mouse 属于订阅者类
Mouse mouse1 = new Mouse("吉米");
Mouse mouse2 = new Mouse("大黑");
Mouse mouse3 = new Mouse("小绿");
//猫属于发布者类
Cat cat = new Cat("花色", "小喵");
cat.AddRun(mouse1.Run);
cat.AddRun(mouse2.Run);
cat.AddRun(mouse3.Run);
//当猫进来的时候,触发事件,老鼠逃跑
cat.CatComing();
//cat.runEvent();
Console.ReadKey();
}
}
- 注意事件只能出现在+=,-=的左边,在发布者类外部无法作为方法调用
- 但是委托可以,不过尽量不要使用,以免出错