【事件】: 事件本质是对委托的封装,事件里面其实就两个方法(即add_event()和remove_event())和一个私有的委托变量,这两个方法里面分别是对这个私有的委托变量进行的合并和移除,当调用事件的+=时其实是调用的事件里面的add_event()方法,同样-=调用的是remove_event()方法。从而实现类的封装性。
================ 使用事件 ===================
public class Example
{
public delegate void DoSth(object sender,EventArgs e); //声明一个自定义委托
public event DoSth myDoSth; //声明事件
internal void Go()
{
DoSth SayHi = new DoSth(PrintStr); //声明一个委托变量,并把已知方法作为其构造函数的参数
object sender = 10;
EventArgs e=new EventArgs();
myDoSth += new DoSth(SayHi); //为事件注册委托
myDoSth(sender,e); //让事件执行方法
}
static void PrintStr(object sender, EventArgs e)
{
Console.WriteLine(sender);
}
}
event的定义必须在类内;通过加入event关键字,在编译的时候编译器会自动针对事件生成一个私有的字段(与此事件相关的委托),以及add_xxx和remove_xxx两个访问器方法。
虽然相关的操作通过delegate也能实现,但使用event更多是为了封装,event通常只能被申明的类访问,外部类对event只能使用+=或者-=,调用都不行。
【通过EventHandler执行方法】
public class Example
{
public event EventHandler myDoSth; //声明事件
internal void Go()
{
object sender = 10;
EventArgs e = new EventArgs();
//为事件注册多个委托
myDoSth += PrintStr; //直接加方法名
myDoSth += Say; //直接加方法名,增加一个委托
myDoSth(sender, e); //让事件执行方法
}
static void PrintStr(object sender, EventArgs e)
{
Console.WriteLine(sender);
}
void Say(object sender, EventArgs e)
{
Console.WriteLine(sender);
}
}
EventHandler就是一个委托
【事件与委托的区分】
1,事件是基于委托实现的,可以通俗地理解为:事件是一种特殊的委托,特殊的地方在于它定义的是一个有两个参数(事件源和事件参数)没有返回值的委托。在类的外部只能施加+=,-=操作符;
2,当事件的订阅者订阅事件时,本质上是将事件的处理方法加入到委托链中,当事件触发时,委托链中的所有事件处理方法都会被调用。
区别:
委托本质是一种自定义类型(class),而事件本质是一个特殊的委托实例(对象)。
使用中委托常用来表达回调,事件表达外部的接口;
【Observer设计模式】是为了定义对象间的一种一对多的依赖关系,以便于当一个对象的状态改变时,其他依赖于它的对象会被自动告知并更新。Observer模式是一种松耦合的设计模式。