国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

解析.Net 4.0 中委托delegate的使用詳解

來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:41:05
文檔

解析.Net 4.0 中委托delegate的使用詳解

解析.Net 4.0 中委托delegate的使用詳解:.Net中的委托從功能上講和c語言或者c++中的方法指針類似,可以像調(diào)用方法一樣調(diào)用委托完成某個(gè)功能,或返回某類結(jié)果。但是.Net畢竟是更高級(jí)的語言,委托Delegate也更高級(jí)了,委托是一種數(shù)據(jù)接口,它包含調(diào)用目標(biāo)和調(diào)用方法的指針;而在.Net中定義的委托都
推薦度:
導(dǎo)讀解析.Net 4.0 中委托delegate的使用詳解:.Net中的委托從功能上講和c語言或者c++中的方法指針類似,可以像調(diào)用方法一樣調(diào)用委托完成某個(gè)功能,或返回某類結(jié)果。但是.Net畢竟是更高級(jí)的語言,委托Delegate也更高級(jí)了,委托是一種數(shù)據(jù)接口,它包含調(diào)用目標(biāo)和調(diào)用方法的指針;而在.Net中定義的委托都

.Net中的委托從功能上講和c語言或者c++中的方法指針類似,可以像調(diào)用方法一樣調(diào)用委托完成某個(gè)功能,或返回某類結(jié)果。但是.Net畢竟是更高級(jí)的語言,委托Delegate也更高級(jí)了,委托是一種數(shù)據(jù)接口,它包含調(diào)用目標(biāo)和調(diào)用方法的指針;而在.Net中定義的委托都繼承自MulticastDelegate即多播委托,所謂的多播委托是指可以包含多個(gè)調(diào)用方法的委托。
一. 先來看下委托的定義:
如下C#代碼定義委托
public delegate void DoSomething(int times);
委托的定義包含5個(gè)部分
1) public表示委托的可訪問性
2) delegate關(guān)鍵字表示要定義一個(gè)委托
3) void表示委托定義方法的返回值
4) DoSomething是委托的名字
5) (int times) 是委托方法的參數(shù)列表,此處的參數(shù)列表可以包括ref參數(shù),也可以有out參數(shù),同樣也可以有parms可變數(shù)量參數(shù);需要注意如果委托中有多個(gè)調(diào)用方法,使用out參數(shù)時(shí)只能返回委托最后執(zhí)行成功的一個(gè)委托方法的計(jì)算值
在C#中定義委托非常簡(jiǎn)單,只比方法定義的返回值之前多一個(gè)delegate關(guān)鍵字即可。
可是我們知道所有的用戶定義委托都繼承自MulticastDelegate;而MulticastDelegate是一個(gè)類;所以自定義的委托肯定也是一個(gè)類;看下上述代碼的IL代碼就可以證明我們的推斷:
代碼如下:
.class public auto ansi sealed delegates.DoSomething
    extends [mscorlib]System.MulticastDelegate
{
    // Methods
    .method public hidebysig specialname rtspecialname
        instance void .ctor (
            object 'object',
            native int 'method'
        ) runtime managed
    {
    } // end of method DoSomething::.ctor

    .method public hidebysig newslot virtual
        instance void Invoke (
            int32 times
        ) runtime managed
    {

    } // end of method DoSomething::Invoke

 
    .method public hidebysig newslot virtual
        instance class [mscorlib]System.IAsyncResult BeginInvoke (
            int32 times,
            class [mscorlib]System.AsyncCallback callback,
            object 'object'
        ) runtime managed
    {

    } // end of method DoSomething::BeginInvoke

 
    .method public hidebysig newslot virtual
        instance void EndInvoke (
            class [mscorlib]System.IAsyncResult result
        ) runtime managed
    {

    } // end of method DoSomething::EndInvoke

} // end of class delegates.DoSomething

二. 定義了委托,當(dāng)然是為了使用它,來看下如何使用委托:
在.Net中有三種委托的形式,分別是方法、匿名方法和lambda表達(dá)式;我們用方法定義的形式看下委托的使用方法
代碼如下:
using System;

namespace delegates
{
 public delegate void DoSomething(int times);

    class Program
    {
        static void Main(string[] args)
        {
            //聲明委托變量并給委托變量賦值
            DoSomething @do = DoA;
            //可以使用+號(hào)或者+=給委托增加方法
            @do += DoB;
            //執(zhí)行委托時(shí)將按照委托的添加順序先后執(zhí)行委托中的方法
            @do(1);
            //也可以通過-號(hào)或者-= 從委托中移除方法
            @do -= DoA;
            @do(2);

            @do -= DoB;
            //將委托中的所有方法都移除掉之后,委托照樣是可以調(diào)用的,只是什么都不做
            @do(3);

            Console.Read();
        }
       //定義一個(gè)委托相同參數(shù)和返回值的方法
        static void DoA(int times)
        {
            Console.WriteLine("Do A {0}", times);
        }

 
        //定義一個(gè)委托相同參數(shù)和返回值的方法
        static void DoB(int times)
        {
            Console.WriteLine("Do B {0}", times);
        }
    }
}

如上代碼中的Main方法,首先我們定義了委托DoSomething的變量@do,并將DoA方法直接賦值給此委托變量;然后我們又使用+=符號(hào)或者+號(hào)給此委托添加了另一個(gè)方法;當(dāng)然也可以使用-或者-=從委托中去掉方法。
委托比C/C++方法指針強(qiáng)大的地方在于其可以容納多個(gè)方法,也可以執(zhí)行+/-操作從方法列表中添加或者刪除掉方法。
在執(zhí)行委托加減運(yùn)算時(shí)有幾個(gè)問題需要我們注意:
1. 委托聲明的寫法
委托聲明時(shí)可以用如下寫法
代碼如下:
DoSomething @do = DoA;

這其實(shí)是一種簡(jiǎn)短的寫法,我們知道在.Net 1.x中這樣寫是不允許的只有到.Net 2.0時(shí)才允許這么寫,在.Net 1.x中必須寫成
代碼如下:
DoSomething @do = new DoSomething(DoA);

我們要在聲明時(shí)就給@do賦予DoA加上DoB
代碼如下:
DoSomething @do = DoA + DoB;

這么寫是不行的,編譯器不干了;必須使用.Net 1.x中的寫法
代碼如下:
DoSomething @do = new DoSomething(DoA) + new DoSomething(DoB);

2. 從委托中減去委托中本不存在的方式時(shí)會(huì)發(fā)生什么呢?
請(qǐng)看如下代碼:
代碼如下:
DoSomething @do = DoA;
@do -= DoB;

第一行代碼我生命了@do并將DoA賦予它;第二行代碼我嘗試從@do中減去DoB,DoB并沒有在@do的方法列表中存在,這樣會(huì)發(fā)生什么情況呢?首先編譯器沒有報(bào)錯(cuò),程序可以正常的編譯;執(zhí)行代碼發(fā)現(xiàn)可以程序可以正常執(zhí)行,調(diào)用@do委托時(shí)正確的執(zhí)行了DoA方法;這說明了.Net包容了我們程序員犯的錯(cuò),我們從委托變量中減去一個(gè)委托中并不包含的方法時(shí),不會(huì)報(bào)錯(cuò)會(huì)正常的執(zhí)行。
3. 對(duì)委托做減法,所有委托都減完了,會(huì)怎樣呢?看如下代碼
代碼如下:
DoSomething @do = new DoSomething(DoA) + new DoSomething(DoB);
@do -= DoA;
@do -= DoB;
@do(1);

這樣的代碼可以成功編譯,但是在運(yùn)行時(shí)會(huì)報(bào)NullReferenceException;這顯然不是我們希望的,所以對(duì)委托做減法時(shí)要特別注意。
代碼如下:
<span style="text-decoration: line-through;">public delegate void DoIt(string task);

class Test
{
    static void Main(string[] args)
    {
        //DoIt聲明,賦予一個(gè)參數(shù)更寬泛的方法是合法的
        DoIt doIt = new DoIt(DoItImpl);
        doIt("hello");
    }

    //比委托定義中的參數(shù)更寬泛,string類型可以隱式轉(zhuǎn)換成object
    static void DoItImpl(object task)
    {
        Console.WriteLine("DoItImpl {0}",task);
    }
}
</span>

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

解析.Net 4.0 中委托delegate的使用詳解

解析.Net 4.0 中委托delegate的使用詳解:.Net中的委托從功能上講和c語言或者c++中的方法指針類似,可以像調(diào)用方法一樣調(diào)用委托完成某個(gè)功能,或返回某類結(jié)果。但是.Net畢竟是更高級(jí)的語言,委托Delegate也更高級(jí)了,委托是一種數(shù)據(jù)接口,它包含調(diào)用目標(biāo)和調(diào)用方法的指針;而在.Net中定義的委托都
推薦度:
標(biāo)簽: 4.0 net net中的
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 亚洲精品高清在线观看 | 国产一级特黄高清免费大片dvd | 日韩不卡手机视频在线观看 | 欧美日韩在线视频 | 香蕉视频你懂的 | 成人一级免费视频 | 好看的电影网站亚洲一区 | 欧美日韩精品一区二区三区 | 国产在线精品观看一区 | 手机看片91精品一区 | 欧美 日韩 国产 色 欧美 日韩 亚洲另类专区 | 国产精品亚洲综合一区 | 亚洲一区色图 | 国产成人精品一区二区视频 | www.亚洲一区 | 高清 国产 日韩 欧美 | 国产成人一区在线播放 | 国产亚洲欧美日韩俺去了 | 午夜伦淫| 欧美日韩精品一区二区三区 | 日韩欧美在线播放 | 亚洲欧洲国产成人综合一本 | 91大神在线观看精品一区 | 高清精品一区二区三区一区 | 亚洲免费在线视频 | 亚洲最新在线观看 | 91香蕉国产亚洲一二三区 | 欧美久久久久久 | 欧美 日韩 亚洲另类专区 | 国产精品第1页在线观看 | 久久精品视频一区二区三区 | 天天操夜夜做 | 日韩中文欧美 | 高清一区二区亚洲欧美日韩 | 香蕉久久一区二区三区 | 一卡二卡在线 | 久久精品男人影院 | 日韩在线观看不卡 | 国产精品亚洲精品观看不卡 | 久久久久国产成人精品亚洲午夜 | 日本色图在线 |