事件

事件是C#中另一高级概念,使用方法和委托相关。奥运会参加百米的田径运动员听到枪声,比赛立即进行。其中枪声是事件,而运动员比赛就是这个事件发生后的动作。不参加该项比赛的人对枪声没有反应。

从程序员的角度分析,当裁判员枪声响起,发生了一个事件,裁判员通知该事件发生,参加比赛的运动员仔细听枪声是否发生。运动员是该事件的订阅者,没有参赛的人不会注意,即没有订阅该事件。

C#中使用事件需要的步骤:
1、创建一个委托;
2、将创建的委托与特定事件关联(.Net类库中的很多事件都是已经定制好的,所以他们也就有相应的一个委托,在编写关联C#事件处理程序--也就是当有事件发生时我们要执行的方法的时候我们需要和这个委托有相同的签名)
3、编写C#事件处理程序;
4、利用编写的C#事件处理程序生成一个委托实例;
5、把这个委托实例添加到产生事件对象的事件列表中去,这个过程又叫订阅事件。

一、定义事件

定义事件时,发生者首先要定义委托,然后根据委托定义事件。定义事件的语法如下:

<访问修饰符> event 委托名 事件名;

定义事件时,一定要有一个委托类型,用这个委托类型来定义处理事件的方法类型。下面定义一个发布者类,并在其内部定义eventRun事件。

class Judgment

{

    //定义一个委托

    public delegate void delegateRun();

    //定义一个事件

    public event delegateRun eventRun;

}

二、订阅事件

定义好事件后,与事件有关的人会订阅事件,只有订阅事件的对象才会收到发生事件的通知,没有订阅该事件的对象则不会收到通知。订阅事件的语法如下:

事件名+=new 委托名(方法名);

假如方法名为Run,那么订阅事件eventRun的代码如下:

judgment.eventRun+=new Judgment.delegateRun(runsport.Run);

judgment为类Judgment的对象,runsport为运动员类RunSports的对象,Run为其中的方法。

事件的订阅通过“+=”操作符来实现,可以给事件加一个或多个方法委托。

 

事件的完整调用使用代码

 

class MyClass //定一个订阅者的类
{
//定义一个委托
public delegate void DelegateABS();

 

//定义一个事件
public event DelegateABS EventABS;
//定义一个方法
public void OK()
{
EventABS();//调用事件
}
}

 

class Swim//定义一个发布者
{
public void You()
{
Console.WriteLine("我喜欢游泳");
}
}
class Program
{
static void Main(string[] args)
{
Swim swim = new Swim();//实例化发布者
MyClass myClass = new MyClass();//实例化订阅者
myClass.EventABS += new MyClass.DelegateABS(swim.You);//事件的固定格式 事件名+= new 委托(发布者的方法)
myClass.OK();
Console.ReadKey();
}
}