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