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