標籤:style color io 使用 ar 資料 問題 sp 代碼
- 委託是一個定義簽名的類型,即方法的傳回值類型和參數清單類型。可以使用委託類型來聲明一個變數,該變數可以引用與委託簽名相同的所有方法。自訂的委託類編譯後可以看到都繼承了它繼承了System.MulticastDelegate類
- 委託定義傳回值一般都是void,因為委託變數可以提供多個訂閱者註冊,如果定義了傳回值,結果會是後面一個方法的傳回值覆蓋前面的,最終只返回一個值,而且發行者與訂閱者是松耦合,發行者不關心誰訂閱了它的事件,為什麼訂閱,更不關心傳回值
- 事件封裝了委託類型的變數,在類的內部不管聲明是public還是protected,它總是private,在類的外部註冊"+="和登出"-="的訪問限定符與你在聲明事件時使用的訪問符相同.如果事件只允許一個客戶訂閱,可以將時間定義成private,這樣外部無法調用"+="訂閱事件,然後實現一個供註冊事件的公用方法,裡面只有賦值操作.
- 事件訪問器類似於屬性訪問器,不同之處在於事件訪問器被命名為 add 和 remove。在大多數情況下都不需要提供自訂的事件訪問器。如果您在代碼中沒有提供自訂的事件訪問器,編譯器會自動添加事件訪問器。
- 事件的調用只能在定義事件的類內調用,但訂閱/取消事件要在類外部
- 在Delegate內部,維護了一個委託鏈表,鏈表上的每一個元素,為一個只包含一個目標方法的委派物件。而通過Delegate基類的GetInvocationList()靜態方法,可以獲得這個委託鏈表。隨後我們遍曆這個鏈表,通過鏈表中的每個委派物件來調用方法,這樣就可以分別獲得每個方法的傳回值,而且可以避免由於異常導致後續函數無法調用的問題
- 它是定義在Delegate基類中的DynamicInvoke()方法,通常用於調用委託方法
public object DynamicInvoke(params object[] args);
- 委託的非同步呼叫:
通過調用GetInvocationList擷取每個委派物件,然後調用委派物件的BeginInvoke方法
- EventHandler,.net定義好的委託,無法包含事件數目據,因為EventArgs中沒有儲存資料的屬性
public delegate void EventHandler(object sender,EventArgs e)
如果要使用帶資料的事件使用下列委託
public delegate void EventHandler<TEventArgs>(
Object sender,
TEventArgs e
)
- .Net Framework的編碼規範:
- 委託類型的名稱都應該以EventHandler結束。
- 委託的原型定義:有一個void傳回值,並接受兩個輸入參數:一個Object 類型,一個 EventArgs類型(或繼承自EventArgs)。
- 事件的命名為 委託去掉 EventHandler之後剩餘的部分。
- 繼承自EventArgs的類型應該以EventArgs結尾。
C#委託與事件