事件是一种特殊的多播委托(一个委托中包含多个调用的方法,但是调用的顺序无法保证,可以使用Delegate类的GetInvocationList()),可以通过事件向其他类或对象通知发生的事情;
发送(引发)事件的类称为 --- 发行者
接收(处理)事件的类称为 --- 订户(订阅者)
事件具有以下属性:
发行者确定何时引发事件,订阅者确定对事件作出何种响应;
一个事件可以有多个订阅者,订阅者可以处理来自多个发行者的事件
没有订阅者的事件永远不会引发
当事件具有多个订户时,引发该事件时会同步调用事件处理程序。
事件基于 EventHandler委托 和 EventArgs基类;继承关系:Object → Delegate → EventHandler
public delegate void EventHandler
订阅&取消事件:
1. 定义一个事件处理程序方法,其签名与该事件的委托签名匹配。 例如,如果事件基于 EventHandler 委托类型,则下面的代码表示方法存根:
void HandleCustomEvent(object sender, CustomEventArgs a)
{
// Do something useful here.
}
2. 使用加法赋值运算符 (+=) 来为事件附加事件处理程序。 在下面的示例中,假设名为 publisher 的对象拥有一个名为 RaiseCustomEvent 的事件。
请注意,订户类需要引用发行者类才能订阅其事件。
public void HandleCustomEvent(object sender, XxEventArgs e)
{
// do something
}
注意:上面的XxEventArgs必须继承于 EventArgs
(a) C# 2.0 语法:
publisher.RaiseCustomEvent += HandleCustomEvent;
(b) C#1.0 语法:必须使用 new 关键字显式创建封装委托
publisher.RaiseCustomEvent += new CustomEventHandler(HandleCustomEvent);
(c) 匿名方法 、 Lambda表达式
3. 使用 -= 取消订阅事件
使用减法赋值运算符 (-=) 取消订阅事件:
publisher.RaiseCustomEvent -= HandleCustomEvent;
所有订户都取消订阅事件后,发行者类中的事件实例将设置为 null。
================================================
Event事件的三个要素:
1. 事件发行者 - - 达到某些条件时激发事件的对象;
2. 事件订阅者 - - 订阅事件并对事件发生时进行处理的对象;
3. 定义发行者和订阅者关系,一个发行者可以有多个订阅者;
Event 与 委托之间的区别:
1. 委托允许直接通过委托去访问相应的处理函数,而事件则只能通过公布的回调函数去调用;
2. 事件只能通过 += 、 -= 方式注册和取消订阅者处理函数,而委托除此之外还可以使用 = 直接复制处理函数;
//事件参数
public class CarInfoEventArgs : EventArgs
{
public string Car { get; private set; }
public CarInfoEventArgs(string car)
{
this.Car = car;
}
}
//事件发行者
public class CarDealer
{
//事件:第一个参数为对象,包含事件的发送者;第二个参数随不同的事件类型而不同,但必须派生于 EventArgs
public event EventHandler NewCarInfo;
public void NewCar(string car)
{
Console.WriteLine("CarDealer: new car {0}", car);
RaiseNewCarInfo(car);
}
//将事件包含在受保护的虚方法中,以使得派生类能够引发事件
protected virtual void RaiseNewCarInfo(string car)
{
EventHandler newCarInfo = NewCarInfo;
//如果没有订阅处理程序,则委托是空的
if (newCarInfo != null)
{
newCarInfo(this, new CarInfoEventArgs(car));
}
}
}
//事件订阅者
class Consumer
{
private string name;
public Consumer(string name)
{
this.name = name;
}
public void NewCarIsHere(object sender, CarInfoEventArgs e)
{
Console.WriteLine("{0}: car {1} is new", name, e.Car);
}
}
class Program
{
static void Main(string[] args)
{
var dealer = new CarDealer();
var mike = new Consumer("Mike");
//继承关系: Object → Delegate → EventHandler
dealer.NewCarInfo += new EventHandler(mike.NewCarIsHere);
var jack = new Consumer("Jack");
dealer.NewCarInfo += jack.NewCarIsHere;
dealer.NewCar("BMW");
Console.ReadKey();
}
链接:
msdn: event
http://www.cnblogs.com/chengxingliang/archive/2013/05/21/3051912.html