C#事件機(jī)制歸納(下)
發(fā)表時間:2024-06-05 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]3.C#中預(yù)定義事件處理方式 學(xué)習(xí)事件,我覺得最不好理解的就是C#中預(yù)定義了事件,使我才開始學(xué)習(xí)事件時一頭霧水。在查了些資料后,終于弄明白了一些,如下: EventArgs是包含事件數(shù)據(jù)的類的基類,用于傳遞事件的細(xì)節(jié)。 EventHandler是一個委托聲明如下(其在.Net類庫中如下聲明...
3.C#中預(yù)定義事件處理方式
學(xué)習(xí)事件,我覺得最不好理解的就是C#中預(yù)定義了事件,使我才開始學(xué)習(xí)事件時一頭霧水。在查了些資料后,終于弄明白了一些,如下:
EventArgs是包含事件數(shù)據(jù)的類的基類,用于傳遞事件的細(xì)節(jié)。
EventHandler是一個委托聲明如下(其在.Net類庫中如下聲明的)
public delegate void EventHandler( object sender , EventArgs e ) 所以,所有形如:
void 函婁名(object 參數(shù)名,EventArgs 參數(shù)名);
的函數(shù)都可以作為Control類的Click事件響應(yīng)方法了。如下面所定義的一個事件響應(yīng)方法:
private void button1_Click(object sender, System.EventArgs e)
參數(shù)object sender表示引發(fā)事件的對象,(其實(shí)這里傳遞的是對象的引用,如果是button1的click事件則sender就是button1)System.EventArgs e 代表事件的相應(yīng)信息,如鼠標(biāo)的x,y值等。
下面我們研究一下Button類看看其中的事件聲明,以Click事件為例。
public event EventHandler Click;
這里定義了一個EventHandler類型的事件Click
private void button1_Click(object sender, System.EventArgs e)
{
...
}
這是我們和button1_click事件所對應(yīng)的方法。注意方法的參數(shù)符合委托中的簽名(既參數(shù)列表)。那我們怎么把這個方法和事件聯(lián)系起來呢,請看下面的代碼。
this.button1.Click += new System.EventHandler(this.button1_Click); (其實(shí)button1.Click 為System.EventHandler委派的實(shí)例事件。與委派中委派實(shí)例委托給某一方法非常相似)
把this.button1_Click方法綁定到this.button1.Click事件。
4.事件的參數(shù)的使用。
using System;
class Class1
{
static void Main()
{
Student s1=new Student();
s1.Name ="Student1";
Student s2=new Student();
s2.Name ="Student2";
s1.RegisterOK +=new Student.DelegateRegisterOkEvent(Student_RegisterOK);
s2.RegisterOK +=new Student.DelegateRegisterOkEvent(Student_RegisterOK);
//當(dāng)Register方法一執(zhí)行,觸發(fā)RegisterOK事件
//RegisterOK事件一觸發(fā),然后執(zhí)行Student_RegisterOK方法
s1.Register();
s2.Register();
Console.ReadLine();
}
static void Student_RegisterOK(RegisterOkArgs e)
{
Console.WriteLine(e.EventInfo);
}
}
class Student
{
public delegate void DelegateRegisterOkEvent(RegisterOkArgs e);
public event DelegateRegisterOkEvent RegisterOK;
public string Name;
public void Register()
{
Console.WriteLine("Register Method");
RegisterOK(new RegisterOkArgs("Student Name: "+Name));
}
}
class RegisterOkArgs:EventArgs
{
public string EventInfo;
public RegisterOkArgs(string eventInfo):base()
{
this.EventInfo =eventInfo;
}
}