天天看點

艾偉:C#3.0筆記(一)預備知識之Delegate

  在學習C#3.0之前還是先來回顧下委托、事件,因為這樣能更加有助于了解C#3.0裡面的一些新的特性,如Lambada表達式等。

  背景

  在C語言中我們可以用函數指針來建立回調函數,但是在C裡面回調函數存在一些安全問題。因為它隻是在記憶體位址中記錄了下來,并沒有像方法的參數類型、參數個數、傳回值等其他安全資訊。而在.Net FrameWork中,回調仍然是可以的,.net framework中提供了更為進階的更為安全的面向對象的delegate來實作。

  定義委托

  在委托中主要包含了三個重要的資訊:

  1.調用的方法的名稱;

  2.方法的參數;

  3.方法的傳回值。

  定義一個簡單的委托:

  這樣的委托就是簽名了參數為兩個int類型傳回值為int類型的參數,Caculate類型的對象可以在運作時動态地調用其指向的方法。要注意的是.net委托既可以指向動态的方法也可以指向靜态的方法。

  C#編譯器在處理delegate的時候,它會先自動産生一個繼承于System.MulticastDelegate的類。正是這樣的類根System.Delegate為委托提供了必要的基礎資訊,以便來維護需要調用的方法清單。我們可以通過IL檢視器看到:

艾偉:C#3.0筆記(一)預備知識之Delegate

  生成的Caculate類中定義了三個方法:BeginInvoke、EndInvoke、Invoke。其中Invoke是核心的方法,它用來以同步的方式調用委托清單中的每個方法。我們可以看一看編譯器是如何定義這幾個方法的。Invoke方法中的參數跟傳回值完全跟Caculate委托的定義一樣的,而BeginInvoke中多了兩個參數一個是AsyncCallback類型的一個是object類型的,EndInvoke方法傳回Int類型。

  通過MulticastDeletate跟Delegate基類擷取更多資訊

  1.Methos屬性:傳回System.Reflection.MethodInfo類型,描述委托所表示的方法資訊。

  2.Target屬性:傳回委托方法所在的對象,如果是靜态方法即傳回null。

  3.GetInvocationList方法:傳回一個Delegate類型的數組,其中數組的每個元素表示一個可以調用的方法。

  4.Combine方法: 靜态方法用來給委托添加一個方法。

  5.Remove方法:靜态方法給委托移除某個方法。

  看下簡單的Caculate的實作,CaculateClient類:

  另外定義了一個輔助方法:

  調用:

  我們可以看到下面的結果:

艾偉:C#3.0筆記(一)預備知識之Delegate

小結

現在我們基本上知道Delegate的原理,已經基本的實作,但是我們并沒有實作一些進階的話題,畢竟Caculate還隻是一個玩具,呵呵。下一篇中将會涉及到多點傳播、複雜點的示例以及事件

繼續閱讀