asp.NET自訂伺服器控制項內部細節

來源:互聯網
上載者:User

如大家要轉載,請保留本人的著作權:
/*
*Description:asp.NET自訂伺服器控制項內部細節系列教程
*Auther:崇崇-天真的好藍
*MSN:chongchong2008@msn.com
*Dates:2007-05-20
*Copyright:ChongChong2008 YiChang HuBei China
*/

關於自訂asp.NET自訂伺服器控制項文章和源碼樣本網上已經很多了,不過有些內部些節方面,讓一些初次接觸這方面技術的朋友難以理解,對伺服器控制項的方方面面也很疑惑。為此,我抽出些時間把自己所理解的東西整理出來,方便大家交流學習。

一 理解事件委託,事件,引發事件以及事件最佳化

.NET架構的事件委託和事件數目據的命名規範:
  事件數目據類由事件名加尾碼EventArgs構成,如:SXLoginEventArgs
  事件委託由事件名加尾碼EventHandler構成,如:SXLoginEventHandler
  引發事件的方法名字是在事件前加上首碼On,OnSXLogin

1。事件委託

委託其實是一個類,委託具有函數指標的粒度和介面的安全性,為什麼這樣說,是因為委託就是安全類型的函數指標,用來回調方法,方法的簽名必須和委託的簽名相匹配。

下面我們看看委託的聲名:
          public delegate void SXLoginEventHandler(object sender,SXLoginEventArgs e);

上面的定義表示定義了一個SXLoginEventHandler的事件委託,傳回型別是void,並分別接受一個object和SXLoginEventArgs類型的參數。object表示事件的寄件者,e表示描述事件的資料。

可以看出事件委託的聲名和類的聲名是類似的,只需增加關鍵字delegate即可。

委託間接派生於System.Delegate,直接派生於System.MulticastDelegate。

2。事件

事件是當有動作發生或狀態改變時,類發出的資訊或通知。

下面我們看看事件的聲名:
           public event SXLoginEventHandler SXLogin ;可以看出事件是與一個委託相關聯的。


3。引發事件

為了在類中實現事件,需要一個事件數目據類,事件委託以及一個發布事件通知的方法。我們需要把這些組合在一起,下面給一個例子:
  
3.1 如果類沒有任何關聯的事件數目據,就直接使用EventArgs類,或其它已存在的事件數目據類,必須匹配。否則,需要定義一個事件數目據類,這個類必須從System.EventArgs中派生,如下:
          public class SXLoginEventArgs:EventArgs{...}

3.2 如果事件沒有關聯的資料,就直接使用System.EventHandler作為事件委託,否則,需要定一個事件委託,如下:
          public delegate void SXLoginEventHandler(object sender , SXLoginEventArgs e );

3.3 用event關鍵字定義事件成員,後面緊跟與此對應的事件委託,如下:
          public event SXLoginEventHandler SXLogin ;
     
 3.4 在類中定義一個虛方法呼叫事件委託,方法的名字是在事件前加上首碼On,如下:
          protected virtual void OnSXLogin(SXLoginEventArgs e)
   {
  if(SXLogin != null)
  {
   SXLogin(this , e);
  }
   }

4。事件最佳化

如果一個類中引發了多個事件,通過為每一個事件聲名一個事件欄位成員來執行時低效的,為此我們換一種方法用屬性來定義事件。

.NET架構有一個System.ComponentModel.EventHanlderList類,這個類是一個最佳化了的委託儲存和取回的鏈表。下面來看看最佳化事件模式是如何?的:

        private EventHanlderList events ;
        protected EventHanlderList Events
 {
  get
  {
   if(events==null)
   {
    events = new EventHanlderList();
   }
   return events;
  }
 }

 protected static readonly object SXLoginEventObject = new object();

 我們用屬性而不是欄位來定義事件,如下:
 public event SXLoginEventHandler SXLogin
 {
  add{Events.AddHandler(SXLoginEventObject,value)};
  remove{Events.RemoveHandler(SXLoginEventObject,value)};
 }



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。