日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

Microsoft.Net框架程序设计学习笔记(15):事件之原理分析

發布時間:2025/3/15 asp.net 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Microsoft.Net框架程序设计学习笔记(15):事件之原理分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

完整定義一個事件的方法

  以Mail發送為例:

  • 定義一個類型用于保存所有需要發送給事件通知接受者的附加信息。
    按.Net框架約定,所有保存事件信息的類型都應該繼承自System.EventArgs,且類型的名稱應該EventArgs結束。
    public class MailMsgEventArgs : EventArgs
    {
    public readonly string from, to, subject, body;

    public MailMsgEventArgs(string from, string to, string subject, string body)
    {
    this.from = from;
    this.to = to;
    this.subject = subject;
    this.body = body;
    }
    }
  • 定義一個委托類型,用于指定事件觸發時被調用的方法原型。
    按.Net框架約定,委托類型名稱應該以EventHandler結束。另外,回調方法的原型應該有一個void返回值,并且接受兩個參數。第1個參數為Object類型,指向發送通知的對象。第2個參數為一個繼承自EventArgs的類型,其中包括所有通知接受者需要的附加信息。如果我們定義的事件沒有需要傳給事件接受者的附加信息,便不必定義新的委托類型。直接使用FCL中的System.EventHandler,并將EventArgs.Empty傳遞給第二個參數即可。EventHandler的原型為:public delegate void EventHandler(object sender, EventArgs e); public delegate void MailMsgEventHandler(Object sender, MailMsgEventArgs args);
  • 定義一個事件成員。 public event MailMsgEventHandler MailMsg;
  • 定義一個受保護的虛方法,負責通知事件的登記對象。 protected virtual void OnMailMsg(MailMsgEventArgs e)
    {
    if(MailMsg != null
    )
    {
    MailMsg(
    this
    , e);
    }
    }
  • 定義一個方法,將輸入轉化為期望的事件。 public void SimulateArrivingMsg(string from, string to, string subject, string body)
    {
    MailMsgEventArgs e
    = new MailMsgEventArgs(from, to, subject, body);
    OnMailMsg(e);
    }
  • 事件原理分析?  

      現在讓我們看看定義MailMsg事件時發生了些什么事情?

      編譯器在遇到事件定義語句:public event MailMsgEventHandler MailMsg會將這段代碼翻譯成以下3個構造:

    //1.一個被初始化為null的私有委托類型字段
    private MailMsgEventHandler MailMsg = null;

    //2.一個允許對象登記事件的公有add_*方法
    [MethodImplAttribute(MethodImplOptions.Synchronized)]
    public void add_MailMsg(MailMsgEventHandler handler)
    {
    MailMsg
    = (MailMsgEventHandler)Delegate.Combine(MailMsg, handler);
    }

    //3.一個允許對象注銷事件的公有remove_*方法
    [MethodImplAttribute(MethodImplOptions.Synchronized)]
    public void remove_MailMsg(MailMsgEventHandler handler)
    {
    MailMsg
    = (MailMsgEventHandler)Delegate.Remove(MailMsg, handler);
    }

      第1步是構造一個委托類型的字段,該字段引用的是一個委托鏈表的首部,鏈表中包含了那些期望在事件發生時被通知的委托對象。當一個偵聽者需要登記事件時,它只需將一個委托實例添加到委托鏈表上就可以了。

      注意:登記和注銷事件的方法應用了MethodImplAttribute特性,這個特性使方法被標識為同步方法,這使得它們得以實現線程安全,也就是說多個偵聽者可以同時登記或注銷事件,而不損壞委托鏈表。

    偵聽事件

      登記、注銷事件代碼示例:

    class Fax
    {
    public Fax(MailManager mm)
    {
    mm.MailMsg
    += new MailManager.MailMsgEventHandler(FaxMsg);    //編譯器將該代碼轉換為:    //mm.add_MailMsg(new MailManager.MailMsgEventHandler(FaxMsg)); }

    private void FaxMsg(object sender, MailManager.MailMsgEventArgs e)
    {
    ........
    }

    public void Unregister(MailManager mm)
    {
    mm.MailMsg
    -= new MailManager.MailMsgEventHandler(FaxMsg);    //編譯器將該代碼轉換為:    //mm.remove_MailMsg(new MailManager.MailMsgEventHandler(FaxMsg));
    }
    }

      當一個對象不再希望接受事件通知時,應該注銷該事件。

      注意:只要一個對象仍然登記有另一個對象的事件,該對象就不可能被執行垃圾收集。如果我們的類型實現了IDisposable接口的Dispose方法,我們應該在其內部注銷其登記的所有事件。  

    轉載于:https://www.cnblogs.com/free722/archive/2011/03/27/1997203.html

    總結

    以上是生活随笔為你收集整理的Microsoft.Net框架程序设计学习笔记(15):事件之原理分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。