C#-委托和事件
要為類構(gòu)造一個事件,必須用 event 來聲明一個 delegate 型的字段,如:
puclic calss Test{
???????? public delegate EventHandler(object sender, EventArgs e); //聲明為delegate 型的事件;
}
然后要指定一個事件的名稱,并寫出處理語句:
??????? public event? EventHandler Load
在創(chuàng)建類的實例后定義這個 “Load”事件:
??????? Test m=new Test();
??????? m.load=new EventHandler(m_Load);
??????? void m_Load(object sender, EventArgs e)
??????? {
??????????????? MessageBox.Show(" this is a class event");
??????? }??????
再看看下面的完整的一段代碼:
?using System;
?
?class TestClass
?{
???? static void Main(string[] args)
????? {
???????? EventClass myEventClass = new EventClass();
???????? myEventClass.CustomEvent += new EventClass.CustomEventHandler(CustomEvent1); // 關(guān)聯(lián)事件句柄;
???????? myEventClass.CustomEvent += new EventClass.CustomEventHandler(CustomEvent2);
??????? myEventClass.InvokeEvent();
??????? myEventClass.CustomEvent -= new EventClass.CustomEventHandler(CustomEvent2);
??????? myEventClass.InvokeEvent();
??????? myEventClass.Load += new EventClass.CustomEventHandler(Load1);
??????? myEventClass.onLoad();
??? }
??? private static void CustomEvent1(object sender, EventArgs e)
??? {
??????? Console.WriteLine("Fire Event 1");
??? }
??? private static void CustomEvent2(object sender, EventArgs e)
??? {
??????? Console.WriteLine("Fire Event 2");
??? }
??? private static void Load1(object sender, EventArgs e)
??? {
??????? Console.WriteLine("Current background color is {0}. Please input:", System.Console.BackgroundColor.ToString());
??? }
}
public class EventClass
{
??? public delegate void CustomEventHandler(object sender, EventArgs e);//首先定義一個委托類型的對象CustomEventHandler
??? //用delegate數(shù)據(jù)類型聲明事件,要用event關(guān)鍵字,這里定義了兩個字件;
??? public event CustomEventHandler CustomEvent;
??? public event CustomEventHandler Load;
???????
??? public void InvokeEvent()
??? {
??????? CustomEvent(this, EventArgs.Empty);
??? }
??? public void onLoad()
??? {
??????? Console.BackgroundColor = ConsoleColor.Red;
??????? Load(this, EventArgs.Empty);
??????? string s = Console.ReadLine();
??????? if (s != "yuping")
??????? {
??????????? Console.WriteLine("You must type 'yuping' for change it !");
??????? }
??????? else
??????? {
??????????? Console.BackgroundColor = System.ConsoleColor.Black;
??????????? Console.Clear();
??????? }
??? }
}
??????? 在包含事件聲明的類中,聲明一個數(shù)據(jù)類型是委托的這么樣的一個對象CustomEventHandler, 它有兩個參數(shù)(sender和e);在這里使用委托的目的就是在運行中向參數(shù)傳遞方法,并由委托對象生成的實例接收這個參數(shù)方法的返回值,因此,在聲明委托型的對象時應(yīng)根據(jù)類中的方法結(jié)構(gòu)來定義,或者說在引用類中應(yīng)當根據(jù)委托型對象的結(jié)構(gòu)來生成響應(yīng)事件的方法結(jié)構(gòu),比如兩者都有哪些類型的參數(shù)、返回值的類型,也就是說兩者要保持一致。同時,要正確地使用C#中的委托,就必須保持三個步驟:聲明——實例化——調(diào)用。
???????
??????? 在上面的代碼中,EventClass 類就體現(xiàn)了這個原則:
??????? 1. 聲明委托類型的對象: public delegate void CustomEventHandler(object sender, EventArgs e);
??????? 2. 創(chuàng)建CustomEventHandler對象的實例CustomEvent:public event CustomEventHandler CustomEvent;
??????? 3. 在InvokeEvent()方法中實現(xiàn)了對該事件的調(diào)用,引用事件。
評論
#1樓?[樓主] 2006-09-15 15:36 仰天一笑?????? 處理實例:如果要在C#中定義一個事件,首先你要創(chuàng)造一個delegate(委派),用他來定義一個你所想使用事件的標簽,然后你才能使用event關(guān)鍵字,在這個委派的基礎(chǔ)上定義一個事件.
兩點需要注意的是:第一,首先你要創(chuàng)造一個委派,第二,根據(jù)你所創(chuàng)造的委派來定義一個事件,這才是一個完整的事件定義.
假設(shè)我們把書中的Product類進行增強.加入了一個NameChanged事件,此事件只有當Name通過屬性渠道被更改時就會發(fā)生.而如果私有變量name是通過類的內(nèi)部代碼被修改時,此事件不會發(fā)生.代碼如下:
public class Product
{
public delegate void NameChangedEventHandler();//定義了事件
public event NameChangedEventHandler NameChanged;//事件的調(diào)用NameChanged
public string Name
{
get{return name;}
set{name = value;
if(NameChanged != null)
{
NameChanged();
}
}
}
}
上一課中的初始化函數(shù)Product(參數(shù)1,參數(shù)2)就無法引發(fā)事件,因為此時的name是通過內(nèi)部被修改的,所以這樣定義的時候,當對象被實例話的時候事件不會發(fā)生,但當對象的name屬性通過saleProduct.Name = "ABCDEFG"被更改時,就會引發(fā)事件.
在此處我們可以看到,當事件發(fā)生時,還沒有執(zhí)行任何實際的代碼,要處理事件,你必須要建立一個對應(yīng)此事件的子程序,此子程序所包含的內(nèi)容就是當一個事件發(fā)生時,所要處理的一系列的操作,然后連接子程序到事件.要控制Product類,你需要在另外一個類中定義一個事件鉤子(Event Handler).此事件鉤子要與事件(Event)有著相同的語法,例如,在Product類中事件是沒有返回參數(shù)也沒有參數(shù)的,所以事件鉤子要與之一致,形式如下:
public void ChangeDetected()
{//此處的代碼就是事件發(fā)生時要處理的代碼}
下一步就是將事件鉤子與事件進行掛鉤,首先做一個delegate指向事件鉤子,然后使用+=符號,把delegate附加到事件上面去: 代碼如下:
Product saleProduct = new Product();
saleProduct.NameChanged += new NameChangedEventHandler(ChangeDetected);
現(xiàn)在,當saleProduct.Name = "Kitchen Garbage"執(zhí)行時,事件就會發(fā)生,而發(fā)生所要處理的具體操作則寫在ChangeDetected()里面.
?
轉(zhuǎn)載于:https://www.cnblogs.com/lindayyh/archive/2008/12/10/1351500.html
總結(jié)
- 上一篇: 为量产FF91拼了!贾跃亭又找来6亿美元
- 下一篇: 对标国产宝马!蔚来ES7 8月28日起交