標籤:訪問 委託 通知 dev class關鍵字 本質 completed obj names
委託
定義委託的文法和定義方法比較相似,只是比方法多了一個關鍵字delegate ,我們都知道方法就是將型別參數化,所謂的型別參數化就是說該方法接受一個參數,而該參數是某種類型的參數,比如int、string等等;而委託是將方 法參數化,說了上面的那個型別參數化之後,相信你也能猜到方法參數化的意思了,對,就是將方法作為一個參數傳到一個委託中。
首先來看看聲明委託的語句:
public deletate void MyDelegate();
public:存取修飾詞 delegate:關鍵字 void:傳回型別 MyDelegate:委託名稱 ( ):參數列表
看到聲明大家會想了,為什麼該委託的傳回值,參數列表要這樣的,我不能返回一個 string,一個int嗎?我不能給委託加幾個參數嗎? 答案是:當然可以,但委託的定義是相對於方法來說的,因為得你的委託最終是要來註冊方法的,而你的方法是具有某種簽名的,所以你要給怎樣簽名的方法來聲明 一個委託,該委託就要和該方法具有同等的簽名,就類似於你用一個int 類型的變數去接受一個string類型的值,顯然是不行的(個人理解)....
* 委託只要定義就可以了,我們並不需要關心他的實現
委託的使用
註冊委託有兩種方法:
第一種:直接將方法賦值[=]或者用“+=” 給一個委託==>委託名 =[+=] 方法名
第二種:委託本質也是一個類,只是一個特殊的類,所以我們也可以執行個體化一個委派物件通過委託建構函式來註冊委託==》委託名 對象名= new 委託名(方法名)
事件
-事件是一種特殊的委託的執行個體,或者說是受限制的委託,是委託一種特殊應用,在類的外部只能施加+=,-=操作符,二者本質上是一個東西。
-event ActionHandler Tick; // 編譯成建立一個私人的委託樣本, 和施加在其上的add, remove方法.
-event只允許用add, remove方法來操作,這導致了它不允許在類的外部被直接觸發,只能在類的內部適合的時機觸發。委託可以在外部被觸發,但是別這麼用。
-使用中,委託常用來表達回調,事件表達外發的介面。
-委託和事件支援靜態方法和成員方法, delegate(void * pthis, f_ptr), 支援靜態返方法時, pthis傳null.支援成員方法時, pthis傳被通知的對象.
-委派物件裡的三個重要欄位是, pthis, f_ptr, pnext, 也就是被通知對象引用, 函數指標/地址, 委託鏈表的下一個委託節點.
1. 怎樣定義委託類型?
delegate + function signature // delegate相當於class關鍵字, function name相當於定義的委託類型.
delegate void Action();
2. 怎樣定義委託執行個體? Action action;
3. 怎樣定義事件?
先定義委託類型 delegate void ActionHandler(object sender, EventArgs args);
再定義事件執行個體 event ActionHandler Tick;
記憶的方法:
委託和事件相當於欄位和屬性
delegate關鍵字類比於class關鍵字, 定義的是一種委託類型,然後再建立委託樣本.
建立委託執行個體時, 用event關鍵字來修飾就變成了建立一個事件. 也就是事件是一種特殊的委託.
1 using System; 2 3 namespace Test 4 { 5 class Program 6 { 7 static void TestEvent() 8 { 9 Console.WriteLine("test event");10 }11 12 static void TestDelegate()13 {14 Console.WriteLine("test delegate");15 }16 17 static void Main(string[] args)18 {19 20 MyClass myObject = new MyClass();21 myObject.WorkCompletedDelegate += TestDelegate;22 myObject.WorkCompleted += TestEvent;23 24 myObject.Fire();25 myObject.WorkCompletedDelegate();26 }27 }28 29 class MyClass30 {31 public delegate void CompletedEventHandler();32 33 public event CompletedEventHandler WorkCompleted;34 public CompletedEventHandler WorkCompletedDelegate;35 36 public void Fire()37 {38 if (this.WorkCompleted != null)39 {40 this.WorkCompleted();41 }42 43 if (this.WorkCompletedDelegate != null)44 {45 this.WorkCompletedDelegate();46 }47 }48 }49 }
C#委託和事件定義和使用