熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

淺析Java與C#的事件處理機制(二)

2013-11-13 10:56:58  來源: .NET編程 

  \在程序中可見事件源Model類顯式地調用了接口中的modelChanged方法實際是把事件狀態對象e作為參數傳遞給了監聽者類中的modelChanged方法

  適配類

  適配類是Java事件模型中極其重要的一部分在一些應用場合事件從源到監聽者之間的傳遞要通過適配類來轉發例如當事件源發出一個事件而有幾個事件監聽者對象都可接收該事件但只有指定對象做出反應時就要在事件源與事件監聽者之間插入一個事件適配器類由適配器類來指定事件應該是由哪些監聽者來響應適配類成為了事件監聽者事件源實際是把適配類作為監聽者注冊入監聽者隊列中而真正的事件響應者並未在監聽者隊列中事件響應者應做的動作由適配類決定目前絕大多數的開發工具在生成代碼時事件處理都是通過適配類來進行的

  C#事件處理

  在NET應用程序開發中不管是WEB Forms(ASPNET)還是Windows Forms都涉及到大量對象的事件響應及處理比如客戶在線提交一份訂單或是在Windows窗口上移動鼠標等都將有事件發生那麼在C#中是怎樣聲明事件並為事件添加響應方法的呢?

  在C#中事件(Events)成員就是用來聲明一個類事件的在類中聲明一個事件成員一般采用如下的語法形式

  public event 代表名 事件名

  如在Control類中聲明了一個Click事件成員其語法如下

  public event EventHandler Click;

  在C#中增加了一個新的數據類型delegate來解決事件處理問題代表數據類型非常類似於C語言中的指針其與指針不同的是其是代碼是安全的可管理的由於C#本身的簡易性對於沒有使用過C及指針的程序來說理解delegate也是非常容易的

  在C#中通過使用delegate你可以通過+=操作符非常容易地為Net對象中的一個事件添加一個甚至多個響應方法還可以通過非常簡單的=操作符取消這些響應方法如下面為temp按鈕添加Click事件的語句

  tempClick+=new SystemEventHandler(thisTest);//為test添加事件處理方法

  在上面聲明事件的語句中Eventhandler是一個delegate(代表)類型其在Net類庫中如下聲明的

  public delegate void EventHandler(object senderEventArgs e);

  這樣所有形如:void 函婁名(object 參數名EventArgs 參數名);的函數都可以作為Control類的Click事件響應方法了如下面所定義的一個事件響應方法

  private void button_Click(object sender SystemEventArgs e)

  由於是通過delegate來處理事件因此可能通過累加使一個事件具有多個響應方法與此同時還可以使一個方法作為多個事件的響應方法(注意在C#語言類中的event成員後面只能出現+==兩個表示添加與取消事件響應函數的操作符)不管是ASPNet還是一般的Windows Forms 編程在C#中基本上我們遇到的事件響應方法都是說明成如下的形式

  private void button_Click(object sender SystemEventArgs e)

  那麼一個事件響應方法的存取權限返回值類型參數及類型甚至方法名稱等是否都必須固定不變呢?答案是不是!

  一般情況下事件的響應方法中都有兩個參數其中一個代表引發事件的對象即sender由於引發事件的對象不可預知的因此我們把其聲明成為object類型所有的對象都適用第二個參數代表引發事件的具體信息各種類型的事件中可能不同這要根據類中事件成員的說明決定

  我們知道事件是通過delegate來處理的假設將要表示事件說明成如下形式

  delegate int MyEventHandler(object sender ToolBarButtonClickEventArgs e);

  則當涉及上面的事件響應函數聲明時就須要聲明成如下的形式

  private int MyTest(object senderToolBarButtonClickEventArgs e) {}

  在給對象添加事件響應方法時就可以用如下的代碼實現

  ControlEvent+=new MyEventHandler(MyTest);

  總的來說Java事件處理更直接簡單而C#事件處理由於引用代理使得程序更靈活更體現程序之間的松藕合性美國神鳥(Stryon http://wwwstryoncomcn)公司宣布在Java開發平台上實現微軟的NET命名為iNET並於近期推出iNET的Beta版本其中就包括用Java實現了C#的三級事件處理機制


From:http://tw.wingwit.com/Article/program/net/201311/14835.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.