如果要在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()裡面.