namespace C14_3
{
//宣告一個delegate
public delegate void EventHandler();
public class MyClass
{
//宣告一個成員變數來保存事件控制碼,(事件被觸發時候被叫用的delegate)
private EventHandler m_Handler = null;
//觸發事件
public void FireMyEvent()
{
if (m_Handler != null)
{
m_Handler();
}
}
//宣告事件存取子
public event EventHandler MyEvent
{
//新增存取子
add
{
//注意,存取子中實際包含了一個名為value的隱含參數
//該參數的值即為客戶程式叫用 += 時傳遞過來的delegate
Console.WriteLine("MyEvent add 被叫用,value的HashCode為:"+value.GetHashCode());
if (value != null) { m_Handler = value; }
//設置m_Handler域保存的handler
}
//刪除存取子
remove
{
Console.WriteLine("MyEvent remove 被叫用,value的HashCode為:",value.GetHashCode());
//設置m_Handler 為null,該事件不再被觸發
if (value == m_Handler) { m_Handler = null; }
}
}
}
public class Program
{
//真正的事件處理函數
public static void MyEventHandler()
{
Console.WriteLine("這是一個事件!");
}
public static void Main()
{
MyClass my = new MyClass();
//基於MyEventHandler函數定義一個EventHandler
EventHandler MyHandler = new EventHandler(MyEventHandler);
Console.WriteLine("MyHandler的HashCode為:"+MyHandler.GetHashCode());
Console.WriteLine("--------------------------------");
//預定事件
Console.WriteLine("my.myEvent += MyHandler 被叫用");
my.MyEvent += MyHandler;
//觸發事件
Console.WriteLine("Mainc函數處發my的MyEvent事件!");
my.FireMyEvent();
//撤銷事件
Console.WriteLine("my.MyEvent -= Myhandler 被叫用");
my.MyEvent -= MyHandler;
Console.WriteLine("----------------------------------");
//再次事圖觸發事件
Console.WriteLine("Mainc函數式圖在撤銷事件後觸發my的MyEvent事件!");
my.FireMyEvent();
}
}
}
沒有留言:
張貼留言