999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

對(duì)C#委托內(nèi)部機(jī)制的探析

2010-10-10 02:25:30韓志強(qiáng)
關(guān)鍵詞:方法

韓志強(qiáng)

(赤峰學(xué)院 計(jì)算機(jī)科學(xué)與技術(shù)系,內(nèi)蒙古 赤峰 0 2 4 0 0 0)

對(duì)C#委托內(nèi)部機(jī)制的探析

韓志強(qiáng)

(赤峰學(xué)院 計(jì)算機(jī)科學(xué)與技術(shù)系,內(nèi)蒙古 赤峰 0 2 4 0 0 0)

委托是用來(lái)處理其它語(yǔ)言(如C/C++、Pascal等)需要用函數(shù)指針來(lái)處理的情況的.不過(guò)與C/C++函數(shù)指針不同,委托是完全面對(duì)對(duì)象的;另外,C/C++指針僅指向成員函數(shù),而委托同時(shí)封裝了對(duì)象實(shí)例和方法.

委托;回調(diào)函數(shù);多路廣播委托;委托推斷

對(duì)于開(kāi)發(fā)人員來(lái)說(shuō),在進(jìn)行程序開(kāi)發(fā)時(shí)經(jīng)常使用回調(diào)函數(shù),它是個(gè)非常強(qiáng)大的編程特性.在C/C++中程序員利用函數(shù)指針,將可執(zhí)行的步驟作為參數(shù)傳給另一個(gè)方法來(lái)實(shí)現(xiàn)回調(diào).而C#使用委托來(lái)提供相同的功能,委托將方法作為對(duì)象封裝起來(lái),允許在運(yùn)行時(shí)間接地綁定一個(gè)方法調(diào)用.下文將對(duì)C#委托的內(nèi)部機(jī)制進(jìn)行探析.

1 委托的定義

委托是一種引用方法的類(lèi)型.一旦為委托分配了方法,委托將與該方法具有完全相同的行為.委托方法的使用可以像其他任何方法一樣,具有參數(shù)和返回值.

在C#中,委托允許將方法作為參數(shù)進(jìn)行傳遞,可用于定義回調(diào)方法,而且委托還可以將方法鏈接在一起.委托類(lèi)似于C/C++函數(shù)指針,但它是類(lèi)型安全的.在C/C++中,函數(shù)指針其實(shí)就是個(gè)內(nèi)存地址,由于該地址不會(huì)攜帶任何其他信息,如函數(shù)期望的參數(shù)個(gè)數(shù)、參數(shù)類(lèi)型、返回值類(lèi)型等,所以這時(shí)的回調(diào)函數(shù)是非類(lèi)型安全的.C#為回調(diào)函數(shù)提供了稱(chēng)為委托的機(jī)制,其能提供所期望的參數(shù)個(gè)數(shù)、參數(shù)類(lèi)型、返回值類(lèi)型等信息,因此委托是類(lèi)型安全的.

委托在C#中被看作一種新的數(shù)據(jù)類(lèi)型,由它聲明的實(shí)例可以引用一個(gè)或多個(gè)方法.在C/C++中的函數(shù)指針只能引用靜態(tài)函數(shù),而C#中的委托既可以引用靜態(tài)方法,也可以引用實(shí)例方法.在引用實(shí)例方法時(shí),委托不僅存儲(chǔ)了一個(gè)對(duì)該方法入口點(diǎn)的一個(gè)引用,還存儲(chǔ)了一個(gè)對(duì)相應(yīng)的對(duì)象實(shí)例的引用,該方法就是通過(guò)此對(duì)象實(shí)例被調(diào)用的.

C#通過(guò)以下三個(gè)步驟實(shí)現(xiàn)一個(gè)委托(d e l eg a t e):

(1)聲明一個(gè)delegate對(duì)象,它應(yīng)與你想要傳遞的方法具有相同的參數(shù)和返回值類(lèi)型.

(2)創(chuàng)建delegate對(duì)象,并將你想要傳遞的函數(shù)作為參數(shù)傳入.

(3)在要實(shí)現(xiàn)異步調(diào)用的地方,通過(guò)上一步創(chuàng)建的對(duì)象來(lái)調(diào)用方法.

2 委托的內(nèi)部機(jī)制

聲明一個(gè)委托類(lèi)型的唯一方法是通過(guò)使用Delegate關(guān)鍵字進(jìn)行委托聲明.在C#中委托類(lèi)型的是間接從S y s t e m.Delegate派生的類(lèi)類(lèi)型,委托類(lèi)型隱含為s e a l e d,所以不允許從一個(gè)委托類(lèi)型派生任何類(lèi)型.也不允許從S y s t e m.Delegate派生非委托類(lèi)類(lèi)型.在此要注意的是,S y s t e m.Delegate本身不是委托類(lèi)型;它是從中派生所有委托類(lèi)型的類(lèi)類(lèi)型.

C#的編譯器也不允許程序員用戶(hù)自己定義一個(gè)直接或間接(通過(guò)S y s t e m.Multicast Delegate類(lèi))從S y s t e m.Delegate派生的類(lèi).但C#要求程序人員使用Delegate關(guān)鍵字定義委托,該關(guān)鍵字會(huì)使C#編譯器生成一個(gè)類(lèi)(即一個(gè)委托數(shù)據(jù)類(lèi)型).

Delegate關(guān)鍵字是派生自S y s t e m.Multicast D e le g a t e類(lèi)的一個(gè)類(lèi)(或稱(chēng)數(shù)據(jù)類(lèi)型)的別名,派生的委托類(lèi)包含I n v o k e()方法,該方法可實(shí)現(xiàn)委托內(nèi)方法的調(diào)用.S y s t e m.Multicast Delegate類(lèi)則是從System.Delegate類(lèi)派生的.其中S y s t e m.Delegate類(lèi)由一個(gè)對(duì)象引用和一個(gè)方法指針(是S y s t e m.R e f l e ct i o n.M e t h o d i n f o類(lèi)型的方法指針)構(gòu)成.創(chuàng)建委托時(shí),編譯器自動(dòng)使用S y s t e m.Multicast Delegate類(lèi)而不是S y s t e m.Delegate類(lèi).S y s t e m.Multicast Delegate類(lèi)也包含了一個(gè)對(duì)象引用和一個(gè)方法指針(和它的D e l eg a t e基類(lèi)是一樣的),但除此之外,它還包含對(duì)另一個(gè)S y s t e m.Multicast Delegate對(duì)象的引用.

向一個(gè)委托添加一個(gè)方法時(shí),Multicast Delegate類(lèi)將會(huì)創(chuàng)建委托類(lèi)型的一個(gè)新實(shí)例,在新實(shí)例中為新增的方法存儲(chǔ)對(duì)象引用和方法指針,并在委托實(shí)例方法列表中添加新的方法作為下一項(xiàng).這樣的結(jié)果就是,Multicast Delegate類(lèi)維護(hù)著由多個(gè)方法構(gòu)成的一個(gè)鏈表.該鏈表列出一個(gè)或多個(gè)方法,其中每個(gè)方法均作為一個(gè)可調(diào)用實(shí)體來(lái)引用.對(duì)于實(shí)例方法,可調(diào)用實(shí)體由該方法和一個(gè)相關(guān)聯(lián)的實(shí)例組成.對(duì)于靜態(tài)方法,可調(diào)用實(shí)體僅由一個(gè)方法組成.調(diào)用委托時(shí),鏈表中的方法會(huì)被依次調(diào)用.委托實(shí)例還有個(gè)有用的特性是:它不知道也不關(guān)心它所封裝的方法所屬的類(lèi);它所關(guān)心的僅限于這些方法必須與委托的類(lèi)型兼容.這使委托非常適合于“匿名”調(diào)用.

3委托的具體實(shí)現(xiàn)——通過(guò)一個(gè)示例具體說(shuō)明

3.2 委托的聲明

委托修飾符可選delegate 返回類(lèi)型 標(biāo)識(shí)符(形參表可選);

表1 委托聲明語(yǔ)法說(shuō)明

在上例中使用如下語(yǔ)句聲明一個(gè)委托類(lèi)型.

publi cdelegate void my delegate(s trngname);

在編譯時(shí),C#編譯器會(huì)生成一個(gè)派生自System.Multicast Delegate類(lèi)的一個(gè)名為 my delegate委托類(lèi).而后可以使用該類(lèi)進(jìn)行委托的實(shí)例化.

3.3 委托的實(shí)例化

可以使用新實(shí)例初始化一個(gè)委托實(shí)例: my d e le g a t e my d e l e=new my delegate( my d e l e_1);

也可使用委托推斷來(lái)實(shí)現(xiàn)委托的實(shí)例化:M ydelegate my d e l e= my d e l e_1;

在編譯上述兩種情況時(shí),C#編譯器創(chuàng)建的代碼是一樣的.

3.4 調(diào)用委托

在上例中, my d e l e("h z q")等效于 my dele.Invoke("h z q")

實(shí)際上,給委托實(shí)例提供括號(hào)與調(diào)用委托類(lèi)的I n v o k e()方法完全相同.在C#中I n v o k e()方法不允許被程序員用戶(hù)調(diào)用. my d e l e是委托類(lèi)型的一個(gè)變量,所以C#編譯器會(huì)用 my dele.Invoke("h z q")代替 my d e l e("h z q").

4 委托的運(yùn)算符

由于委托是支持多播的,因此委托除了支持“=”賦值運(yùn)算符(可初始化一個(gè)委托,或?qū)⒃星宄眯碌奈刑鎿Q它們)外,還支持“+/+=”運(yùn)算符(將其它委托添加到委托鏈中),及支持“-/-=”運(yùn)算符(將其它委托從委托鏈中刪除).

在這里應(yīng)注意的是,無(wú)論“+“、“-“還是它們的復(fù)合版本(“+=“、“-=“),在內(nèi)部都是使用靜態(tài)方法S y s t e m.Delegate.Combine()和S y s t e m.Delegate.Remove()來(lái)實(shí)現(xiàn)的.這兩個(gè)方法都獲取Delegate類(lèi)型的兩個(gè)參數(shù).第一個(gè)方法Combine()會(huì)連接兩個(gè)參數(shù),將兩個(gè)委托的調(diào)用列表順序連接起來(lái).第二個(gè)方法Remove()則搜索由第一個(gè)參數(shù)指定的委托鏈,并刪除由第二個(gè)參數(shù)指定的委托.對(duì)于Combine()方法,它的兩個(gè)參數(shù)都可以為n u l l,其中一個(gè)參數(shù)為n u l l,Combine()會(huì)返回非空的那個(gè)參數(shù).如果兩個(gè)都為n u l l,則 Combine()返回空.

5 結(jié)束語(yǔ)

委托在.N E T F r a m e work中應(yīng)用的非常廣泛,同時(shí)也是C#編程中的重要元素,如何更好的理解委托,在基于Wi n d o w s平臺(tái)下的面向?qū)ο缶幊讨惺欠浅jP(guān)鍵的.為此我在本文中對(duì)委托的內(nèi)部機(jī)制進(jìn)行針對(duì)性探析,希望能對(duì)在理解委托方面有困難的人能有所幫助.

〔1〕[美]Mark Michaelis.周靖譯.C# 本質(zhì)論.

〔2〕[美]Mark Michaelis.周靖譯.C# 本質(zhì)論(第 2版).

〔3〕[美]Andrew Troelsen. 朱曄等譯.C# 與.NET3.5高級(jí)程序設(shè)計(jì)(第4版).

T P 3 1 2

A

1673-260X(2010)10-0037-02

猜你喜歡
方法
中醫(yī)特有的急救方法
中老年保健(2021年9期)2021-08-24 03:52:04
高中數(shù)學(xué)教學(xué)改革的方法
化學(xué)反應(yīng)多變幻 “虛擬”方法幫大忙
變快的方法
兒童繪本(2020年5期)2020-04-07 17:46:30
學(xué)習(xí)方法
用對(duì)方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
最有效的簡(jiǎn)單方法
山東青年(2016年1期)2016-02-28 14:25:23
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
賺錢(qián)方法
捕魚(yú)
主站蜘蛛池模板: 国产在线无码一区二区三区| 成人噜噜噜视频在线观看| 免费亚洲成人| 大学生久久香蕉国产线观看| 四虎精品黑人视频| 人妻21p大胆| 国产成熟女人性满足视频| 国产欧美日韩专区发布| www.91在线播放| 中文字幕人成乱码熟女免费| 91av国产在线| 日韩欧美国产另类| 免费在线看黄网址| 九月婷婷亚洲综合在线| 国产视频你懂得| 精品国产成人a在线观看| 免费国产一级 片内射老| 在线视频精品一区| 青青草欧美| 久996视频精品免费观看| 国产精品夜夜嗨视频免费视频| 精品福利视频网| 五月天在线网站| 亚洲国产黄色| 综合天天色| 国产丝袜啪啪| 色妞永久免费视频| 亚洲色图欧美视频| 国产精品亚洲一区二区在线观看| 91在线播放国产| 亚洲欧洲日产无码AV| 国内精品免费| 一级毛片无毒不卡直接观看| 久久综合五月| 国产99在线| 国产无吗一区二区三区在线欢| 福利国产微拍广场一区视频在线| 亚洲无码高清视频在线观看| 蜜臀AVWWW国产天堂| 国产18在线播放| 天天综合色天天综合网| AV在线天堂进入| 中文字幕 日韩 欧美| 麻豆精品在线| 成人福利在线看| 热re99久久精品国99热| 欧美视频免费一区二区三区| 91免费观看视频| 亚洲网综合| 国产精品丝袜视频| 免费人成视网站在线不卡 | 国产区免费| 青草精品视频| 亚洲精品麻豆| 国产一级小视频| 日韩欧美综合在线制服| 国产亚洲精品资源在线26u| 中国毛片网| 最新亚洲人成无码网站欣赏网| aⅴ免费在线观看| 九色在线视频导航91| 热热久久狠狠偷偷色男同| 中文字幕丝袜一区二区| 91色在线观看| 不卡无码h在线观看| 激情综合网址| 国产福利拍拍拍| 日韩中文字幕亚洲无线码| 国产噜噜噜| 欧美另类视频一区二区三区| 一级毛片视频免费| 欧美专区日韩专区| 毛片a级毛片免费观看免下载| 91久久偷偷做嫩草影院电| 久久久久亚洲AV成人人电影软件| 亚洲欧美综合在线观看| 国产精品亚洲а∨天堂免下载| av在线5g无码天天| 人妻中文字幕无码久久一区| 国产丝袜无码精品| 国产又粗又猛又爽视频| 成年片色大黄全免费网站久久|