C#委託與事件

來源:互聯網
上載者:User

標籤:style   color   io   使用   ar   資料   問題   sp   代碼   

  1. 委託是一個定義簽名的類型,即方法的傳回值類型和參數清單類型。可以使用委託類型來聲明一個變數,該變數可以引用與委託簽名相同的所有方法。自訂的委託類編譯後可以看到都繼承了它繼承了System.MulticastDelegate類

  2. 委託定義傳回值一般都是void,因為委託變數可以提供多個訂閱者註冊,如果定義了傳回值,結果會是後面一個方法的傳回值覆蓋前面的,最終只返回一個值,而且發行者與訂閱者是松耦合,發行者不關心誰訂閱了它的事件,為什麼訂閱,更不關心傳回值

  3. 事件封裝了委託類型的變數,在類的內部不管聲明是public還是protected,它總是private,在類的外部註冊"+="和登出"-="的訪問限定符與你在聲明事件時使用的訪問符相同.如果事件只允許一個客戶訂閱,可以將時間定義成private,這樣外部無法調用"+="訂閱事件,然後實現一個供註冊事件的公用方法,裡面只有賦值操作.

  4. 事件訪問器類似於屬性訪問器,不同之處在於事件訪問器被命名為 add 和 remove。在大多數情況下都不需要提供自訂的事件訪問器。如果您在代碼中沒有提供自訂的事件訪問器,編譯器會自動添加事件訪問器。

  5. 事件的調用只能在定義事件的類內調用,但訂閱/取消事件要在類外部
  6. 在Delegate內部,維護了一個委託鏈表,鏈表上的每一個元素,為一個只包含一個目標方法的委派物件。而通過Delegate基類的GetInvocationList()靜態方法,可以獲得這個委託鏈表。隨後我們遍曆這個鏈表,通過鏈表中的每個委派物件來調用方法,這樣就可以分別獲得每個方法的傳回值,而且可以避免由於異常導致後續函數無法調用的問題

  7. 它是定義在Delegate基類中的DynamicInvoke()方法,通常用於調用委託方法
    public object DynamicInvoke(params object[] args);

  8. 委託的非同步呼叫:
    通過調用GetInvocationList擷取每個委派物件,然後調用委派物件的BeginInvoke方法

  9. EventHandler,.net定義好的委託,無法包含事件數目據,因為EventArgs中沒有儲存資料的屬性
    public delegate void EventHandler(object sender,EventArgs e)
    如果要使用帶資料的事件使用下列委託
    public delegate void EventHandler<TEventArgs>(
    Object sender,
    TEventArgs e
    )

  10. .Net Framework的編碼規範:
    • 委託類型的名稱都應該以EventHandler結束。
    • 委託的原型定義:有一個void傳回值,並接受兩個輸入參數:一個Object 類型,一個 EventArgs類型(或繼承自EventArgs)。
    • 事件的命名為 委託去掉 EventHandler之後剩餘的部分。
    • 繼承自EventArgs的類型應該以EventArgs結尾。

C#委託與事件

聯繫我們

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

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

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.