如果要在c#中定義一個事件,首先你要創造一個delegate(委派),用他來定義一個你所想使用事件的標簽,然后你才能使用event關鍵字,在這個委派的基礎上定義一個事件.
兩點需要注意的是:第一,首先你要創造一個委派,第二,根據你所創造的委派來定義一個事件,這才是一個完整的事件定義.
假設我們把書中的product類進行增強.加入了一個namechanged事件,此事件只有當name通過屬性渠道被更改時就會發生.而如果私有變量name是通過類的內部代碼被修改時,此事件不會發生.代碼如下:
public class product
{
public delegate void namechangedeventhandler();//定義了事件
public event namechangedeventhandler namechanged;//事件的調用namechanged
public string name
{
get{return name;}
set{name = value;
if(namechanged != null)
{
namechanged();
}
}
}
}
上一課中的初始化函數product(參數1,參數2)就無法引發事件,因為此時的name是通過內部被修改的,所以這樣定義的時候,當對象被實例話的時候事件不會發生,但當對象的name屬性通過saleproduct.name = "abcdefg"被更改時,就會引發事件.
在此處我們可以看到,當事件發生時,還沒有執行任何實際的代碼,要處理事件,你必須要建立一個對應此事件的子程序,此子程序所包含的內容就是當一個事件發生時,所要處理的一系列的操作,然后連接子程序到事件.要控制product類,你需要在另外一個類中定義一個事件鉤子(event handler).此事件鉤子要與事件(event)有著相同的語法,例如,在product類中事件是沒有返回參數也沒有參數的,所以事件鉤子要與之一致,形式如下:
public void changedetected()
{//此處的代碼就是事件發生時要處理的代碼}
下一步就是將事件鉤子與事件進行掛鉤,首先做一個delegate指向事件鉤子,然后使用+=符號,把delegate附加到事件上面去: 代碼如下:
product saleproduct = new product();
saleproduct.namechanged += new namechangedeventhandler(changedetected);
現在,當saleproduct.name = "kitchen garbage"執行時,事件就會發生,而發生所要處理的具體操作則寫在changedetected()里面.
希望我把事件處理機制講清楚了,這里可真難懂,哎,我算是搞明白是怎么一會事情了,下一文章準備找一篇網上的關于事件處理文章進行理解,如果理解得沒問題,那么說明我是真懂了,大家如果有什么不明白的地方可以給我留言,留言必復
新聞熱點
疑難解答