原創|其它|編輯:郝浩|2009-05-19 13:53:46.000|閱讀 439 次
概述:已經基本的實現,現在基本上知道 Deleg 原理。但是并沒有實現一些高級的話題,終究 Cacul 還只是一個玩具,呵呵。下一篇中將會涉及到多播、復雜點的示例以及事件。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
已經基本的實現,現在基本上知道 Deleg 原理。但是并沒有實現一些高級的話題,終究 Cacul 還只是一個玩具,呵呵。下一篇中將會涉及到多播、復雜點的示例以及事件。
因為這樣能更加有助于理解 C#3.0 里面的一些新的特性,學習 C#3.0 之前還是先來回顧下委托、事件。如 Lambada 表達式等。
但是 C 里面回調函數存在一些安全問題。因為它只是內存地址中記錄了下來, C 語言中我可以用函數指針來創建回調函數。并沒有像方法的參數類型、參數個數、返回值等其他平安信息。而在 .Net FrameWork 中,回調仍然是可以的 .net framework 中提供了更為高級的更為平安的面向對象的 deleg 來實現。
委托中主要包含了三個重要的信息:
1. 調用的方法的名稱;
2. 方法的參數;
3. 方法的返回值。
定義一個簡單的委托:
Cacul 類型的對象可以在運行時動態地調用其指向的方法。要注意的 .net 委托既可以指向動態的方法也可以指向靜態的方法。 這樣的委托就是簽名了參數為兩個 int 類型返回值為 int 類型的參數。
會先自動發生一個繼承于 System.MulticastDeleg 類。正是這樣的類根 System.Deleg 為委托提供了必要的基礎信息,C# 編譯器在處置 deleg 時候。以便來維護需要調用的方法列表。可以通過 IL 檢查器看到 :
用來以同步的方式調用委托列表中的每個方法。可以看一看編譯器是如何定義這幾個方法的 Invoke 方法中的參數跟返回值完全跟 Cacul 委托的定義一樣的 , 生成的 Cacul 類中定義了三個方法 :BeginInvok EndInvoke Invoke 其中 Invoke 核心的方法。而 BeginInvok 中多了兩個參數一個是 AsyncCallback 類型的一個是 object 類型的 EndInvoke 方法返回 Int 類型。
所以可以通過這兩個類來獲取委托更多的輔助信息。這里只列出一些常用的屬性和方法,通過上面的 IL 代碼也可以看到編譯器生成委托時的類是繼承于 MulticastDeleg 而 MulticastDeleg 繼承于 Deleg 類。可以在 msdn 上獲取更多地這兩個類的內容 (
描述委托所表示的方法信息。 1.Metho 屬性:返回 System.Reflection.MethodInfo 類型。
如果是靜態方法即返回 null 2.Target 屬性 : 返回委托方法所在對象。
其中數組的每個元素表示一個可以調用的方法。 3.GetInvocationList 方法:返回一個 Deleg 類型的數組。
4.Combin 方法 : 靜態方法用來給委托添加一個方法。
5.Remov 方法 : 靜態方法給委托移除某個方法。
CaculateCli 類 看下簡單的 Cacul 實現。:
另外定義了一個輔助方法 :
調用 :
可以看到下面的結果 :
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:博客園