萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> 編程語言綜合 >> C#事件訪問器

C#事件訪問器

  我們可以通過為事件定義事件訪問器,來控制事件運算符+=、-=運算符的行為

  有兩個訪問器: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!");

  }

  }

copyright © 萬盛學電腦網 all rights reserved