事件
事件是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();
}
}