我們可以通過為事件定義事件訪問器,來控制事件運算子+=、-=運算子的行為
有兩個訪問器:add和remove
聲明事件的訪問器看上去和聲明一個屬性差不多
下面樣本示範了具有訪問器的聲明.兩個訪問器都有叫做value的隱式值參數,它接受執行個體或靜態方法的引用
public event EventHandler Elapsed
{
add
{
//... 執行+=運算子的代碼
}
remove
{
//... 執行-=運算子的代碼
}
}
聲明了事件訪問器後,事件不包含任何內嵌委派物件.我們必須實現自己的機制來儲存和移除事件的方法
事件訪問器表現為void方法,也就是不能使用會傳回值的return語句
完整樣本:
//聲明一個delegate
delegate void EventHandler();
class MyClass
{
//聲明一個成員變數來儲存事件控制代碼(事件被激發時被調用的delegate)
private EventHandler m_Handler = null;
//激發事件
public void FireAEvent()
{
if (m_Handler != null)
{
m_Handler();
}
}
//聲明事件
public event EventHandler AEvent
{
//添加訪問器
add
{
//注意,訪問器中實際包含了一個名為value的隱含參數
//該參數的值即為客戶程式調用+=時傳遞過來的delegate
Console.WriteLine("AEvent add被調用,value的HashCode為:" + value.GetHashCode());
if (value != null)
{
//設定m_Handler域儲存新的handler
m_Handler = value;
}
}
//刪除訪問器
remove
{
Console.WriteLine("AEvent remove被調用,value的HashCode為:" + value.GetHashCode());
if (value == m_Handler)
{
//設定m_Handler為null,該事件將不再被激發
m_Handler = null;
}
}
}
}
class Program
{
static void Main(string[] args)
{
MyClass obj = new MyClass();
//建立委託
EventHandler MyHandler = new EventHandler(MyEventHandler);
MyHandler += MyEventHandle2;
//將委託註冊到事件
obj.AEvent += MyHandler;
//激發事件
obj.FireAEvent();
//將委託從事件中撤銷
obj.AEvent -= MyHandler;
//再次激發事件
obj.FireAEvent();
Console.ReadKey();
}
//事件處理常式
static void MyEventHandler()
{
Console.WriteLine("This is a Event!");
}
//事件處理常式
static void MyEventHandle2()
{
Console.WriteLine("This is a Event2!");
}
}