亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

        2010-10-10 02:25:30韓志強(qiáng)
        關(guān)鍵詞:編譯器調(diào)用委托

        韓志強(qiáng)

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

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

        韓志強(qiáng)

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

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

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

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

        1 委托的定義

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

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

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

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

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

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

        (3)在要實現(xiàn)異步調(diào)用的地方,通過上一步創(chuàng)建的對象來調(diào)用方法.

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

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

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

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

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

        3委托的具體實現(xiàn)——通過一個示例具體說明

        3.2 委托的聲明

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

        表1 委托聲明語法說明

        在上例中使用如下語句聲明一個委托類型.

        publi cdelegate void my delegate(s trngname);

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

        3.3 委托的實例化

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

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

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

        3.4 調(diào)用委托

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

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

        4 委托的運算符

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

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

        5 結(jié)束語

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

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

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

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

        T P 3 1 2

        A

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

        猜你喜歡
        編譯器調(diào)用委托
        基于相異編譯器的安全計算機(jī)平臺交叉編譯環(huán)境設(shè)計
        核電項目物項調(diào)用管理的應(yīng)用研究
        LabWindows/CVI下基于ActiveX技術(shù)的Excel調(diào)用
        績效評價在委托管理酒店中的應(yīng)用
        新聞前哨(2016年1期)2016-12-01 06:18:04
        基于系統(tǒng)調(diào)用的惡意軟件檢測技術(shù)研究
        治理現(xiàn)代化:委托制下的權(quán)力清單制
        招標(biāo)代理中的授權(quán)委托——以案說法
        委托理財忌保底 投資風(fēng)險需自負(fù)
        浙江人大(2014年1期)2014-03-20 16:20:03
        通用NC代碼編譯器的設(shè)計與實現(xiàn)
        利用RFC技術(shù)實現(xiàn)SAP系統(tǒng)接口通信
        久久精品国产99久久无毒不卡| 亚洲精品自产拍在线观看| 色婷婷久久一区二区三区麻豆| 午夜dj在线观看免费视频| 国产又黄又大又粗视频| 久久久久中文字幕精品无码免费| 亚洲AV成人无码久久精品四虎| 无码高清视频在线播放十区| 久久久久久人妻一区二区无码Av| 日本精品国产1区2区3区| 国产精品亚洲一区二区三区妖精| 亚洲av推荐网站在线观看| 午夜免费观看一区二区三区| 日韩一区二区av极品| 久草视频这里只有精品| 国产网站一区二区三区| 国产精品美女一区二区视频 | 国产免费专区| 国产伪娘人妖在线观看| 久久天堂av综合合色| 中文字幕人妻互换激情| 久久综合九色综合97婷婷| 制服丝袜一区二区三区| 五月天国产成人av免费观看| 琪琪的色原网站| 亚洲电影一区二区三区| 青草青草久热精品视频国产4| 国产一级一片内射在线| 国产精品一区二区蜜臀av| 亚洲中文字幕九色日本| 天堂8在线新版官网| 亚洲av永久无码精品网站在线观看| 搡老熟女中国老太| 甲状腺囊实性结节三级| 午夜日本精品一区二区| 老岳肥屁熟女四五十路| 色婷婷久久精品一区二区| 国产一区二区三区久久精品| 国产99久久久国产精品免费看| www国产无套内射com| 在线观看视频亚洲|