最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2013年05月18日 15:38:33   作者:  
本篇文章是對.Net 4.0 中委托delegate的使用進行了詳細的分析介紹,需要的朋友參考下
.Net中的委托從功能上講和c語言或者c++中的方法指針類似,可以像調(diào)用方法一樣調(diào)用委托完成某個功能,或返回某類結(jié)果。但是.Net畢竟是更高級的語言,委托Delegate也更高級了,委托是一種數(shù)據(jù)接口,它包含調(diào)用目標(biāo)和調(diào)用方法的指針;而在.Net中定義的委托都繼承自MulticastDelegate即多播委托,所謂的多播委托是指可以包含多個調(diào)用方法的委托。
一. 先來看下委托的定義:
如下C#代碼定義委托
public delegate void DoSomething(int times);
委托的定義包含5個部分
1) public表示委托的可訪問性
2) delegate關(guān)鍵字表示要定義一個委托
3) void表示委托定義方法的返回值
4) DoSomething是委托的名字
5) (int times) 是委托方法的參數(shù)列表,此處的參數(shù)列表可以包括ref參數(shù),也可以有out參數(shù),同樣也可以有parms可變數(shù)量參數(shù);需要注意如果委托中有多個調(diào)用方法,使用out參數(shù)時只能返回委托最后執(zhí)行成功的一個委托方法的計算值
在C#中定義委托非常簡單,只比方法定義的返回值之前多一個delegate關(guān)鍵字即可。
可是我們知道所有的用戶定義委托都繼承自MulticastDelegate;而MulticastDelegate是一個類;所以自定義的委托肯定也是一個類;看下上述代碼的IL代碼就可以證明我們的推斷:
復(fù)制代碼 代碼如下:

.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表達式;我們用方法定義的形式看下委托的使用方法
復(fù)制代碼 代碼如下:

using System;

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

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

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

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

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

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

DoSomething @do = DoA;

這其實是一種簡短的寫法,我們知道在.Net 1.x中這樣寫是不允許的只有到.Net 2.0時才允許這么寫,在.Net 1.x中必須寫成
復(fù)制代碼 代碼如下:

DoSomething @do = new DoSomething(DoA);

我們要在聲明時就給@do賦予DoA加上DoB
復(fù)制代碼 代碼如下:

DoSomething @do = DoA + DoB;

這么寫是不行的,編譯器不干了;必須使用.Net 1.x中的寫法
復(fù)制代碼 代碼如下:

DoSomething @do = new DoSomething(DoA) + new DoSomething(DoB);

2. 從委托中減去委托中本不存在的方式時會發(fā)生什么呢?
請看如下代碼:
復(fù)制代碼 代碼如下:

DoSomething @do = DoA;
@do -= DoB;

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

DoSomething @do = new DoSomething(DoA) + new DoSomething(DoB);
@do -= DoA;
@do -= DoB;
@do(1);

這樣的代碼可以成功編譯,但是在運行時會報NullReferenceException;這顯然不是我們希望的,所以對委托做減法時要特別注意。
復(fù)制代碼 代碼如下:

<span style="text-decoration: line-through;">public delegate void DoIt(string task);

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

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

相關(guān)文章

  • Visual Studio(VS2017)配置C/C++ PostgreSQL9.6.3開發(fā)環(huán)境

    Visual Studio(VS2017)配置C/C++ PostgreSQL9.6.3開發(fā)環(huán)境

    這篇文章主要為大家詳細介紹了Visual Studio(VS2017)配置C/C++,PostgreSQL9.6.3開發(fā)環(huán)境,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 一個ASP.Net下的WebShell實例

    一個ASP.Net下的WebShell實例

    一個ASP.Net下的WebShell,主要完成cmd命令。一般的服務(wù)器設(shè)置,asp.net用戶的權(quán)限都比較高。如果asp的webshell無法執(zhí)行,可能asp.net的可以執(zhí)行。
    2013-07-07
  • .net如何優(yōu)雅的使用EFCore實例詳解

    .net如何優(yōu)雅的使用EFCore實例詳解

    這篇文章主要為大家介紹了.net如何優(yōu)雅的使用EFCore實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • asp.net core web api項目添加自定義中間件的實現(xiàn)

    asp.net core web api項目添加自定義中間件的實現(xiàn)

    ASP.NET Core Web API項目中可以通過自定義中間件來對請求進行時間戳校驗,本文就來介紹一下項目添加自定義中間件的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2025-01-01
  • jQuery實現(xiàn)倒計時跳轉(zhuǎn)的例子

    jQuery實現(xiàn)倒計時跳轉(zhuǎn)的例子

    這篇文章主要介紹了jQuery實現(xiàn)倒計時跳轉(zhuǎn)的例子,需要的朋友可以參考下
    2014-05-05
  • Entity?Framework導(dǎo)航屬性介紹

    Entity?Framework導(dǎo)航屬性介紹

    這篇文章介紹了Entity?Framework的導(dǎo)航屬性,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • ASP.NET2.0 WebRource,開發(fā)微調(diào)按鈕控件

    ASP.NET2.0 WebRource,開發(fā)微調(diào)按鈕控件

    ASP.NET2.0 WebRource,開發(fā)微調(diào)按鈕控件...
    2006-09-09
  • ASP.NET Core Zero模塊系統(tǒng)講解

    ASP.NET Core Zero模塊系統(tǒng)講解

    本文詳細講解了ASP.NET Core Zero模塊系統(tǒng),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • 詳解如何在ASP.NET Core中編寫高效的控制器

    詳解如何在ASP.NET Core中編寫高效的控制器

    這篇文章主要介紹了詳解如何在ASP.NET Core中編寫高效的控制器,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • uni-app結(jié)合.NET?7實現(xiàn)微信小程序訂閱消息推送

    uni-app結(jié)合.NET?7實現(xiàn)微信小程序訂閱消息推送

    本文主要介紹了uni-app結(jié)合.NET?7實現(xiàn)微信小程序訂閱消息推送,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02

最新評論

万载县| 静宁县| 尉犁县| 旬阳县| 景德镇市| 吉林省| 牡丹江市| 扎囊县| 大渡口区| 尼勒克县| 牡丹江市| 海晏县| 米泉市| 永清县| 拜城县| 江川县| 东港市| 涞水县| 曲水县| 巴东县| 潜山县| 永靖县| 靖江市| 祥云县| 固镇县| 眉山市| 抚顺县| 武乡县| 乐安县| 汨罗市| 肥城市| 游戏| 公主岭市| 新和县| 陕西省| 灵武市| 沙河市| 牟定县| 天峻县| 泸州市| 陆良县|