欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用.NET中的Action及Func泛型委托深入剖析

 更新時間:2012年12月30日 13:25:26   作者:  
委托,在C#編程中占有極其重要的地位,委托可以將函數(shù)封裝到委托對象中,并且多個委托可以合并為一個委托,委托對象則可以像普通對象一樣被存儲、傳遞,之后在任何時刻進行調用,因此,C#中函數(shù)回調機制的實現(xiàn)基本上依賴于委托,感興趣的朋友可以參考下

委托,在C#編程中占有極其重要的地位,委托可以將函數(shù)封裝到委托對象中,并且多個委托可以合并為一個委托,委托對象則可以像普通對象一樣被存儲、傳遞,之后在任何時刻進行調用,因此,C#中函數(shù)回調機制的實現(xiàn)基本上依賴于委托。C#的delegate關鍵字用于聲明委托,它具有將聲明委托類型映射到System.Delegate類的能力,System.Delegate類位于mscorlib.dll中,是.NET的基礎核心類之一。使用delegate關鍵字聲明一個委托,實質上創(chuàng)建了System.Delegate的派生類,因此委托類型并非結構體也不是其它類型,它是一個類。一個委托對象也就是一個類的實例。以下是Delegate類的聲明:

復制代碼 代碼如下:

public abstract class Delegate

Delegate是所以委托類型的基類,C#中的多播委托實際上是MulticastDelegate類,它是System.Delegate的派生類,而本文中介紹的Action、Func泛型委托實際上都是MulticastDelegate類的派生類型。C#中當我們使用delegate關鍵字聲明一個委托類型時,實際上是由C#編譯器根據(jù)我們聲明時的方法簽名幫助我們生成一個與簽名匹配的,派生自MulticastDelegate的類。在泛型大量應用之前,我們寫一個C#程序的時候可能會使用delegate關鍵字聲明許多委托類型,因為這些類型都對應于不同的方法簽名。通過Visual Studio的對象瀏覽器查看mscorlib可以看到這兩種重要的泛型委托: 

imageimage

 

 

 


其中除了Action之外,其它的委托都是泛型的,其實就是一些泛型類。這便是.NET核心庫中全部的泛型委托了。這些泛型委托分為Func、Action中,它們借助于泛型特性,可以替代C#中幾乎所有的委托類型,也就是說一般情況下,在我們的程序中不必再聲明任何新的委托類型,就可以包裝所有的函數(shù)了。比如我們有兩個方法:

復制代碼 代碼如下:

public static void OtputString(string str)
{
    Console.WriteLine(str);
}
public static int Add(int a, int b)
{
    return a + b;
}

Func泛型委托與Action相比即多出了一個TResult類型參數(shù),用于函數(shù)具有返回值的情況,Action泛型委托用于沒有返回值的函數(shù)。當我們要獲得這兩個方法的委托對象時這樣變可以了:
復制代碼 代碼如下:

var action = new Action<string>(OtputString);
action("OutputString Invoked!");
var func = new Func<int, int, int>(Add);
var sum = func(3, 5);
Console.WriteLine(sum);

可以看見,當我們將具有返回值的函數(shù)包裝成委托對象時使用Func委托,如果函數(shù)沒有返回值則使用Action,核心庫提供的泛型委托類型參數(shù)最短的為0,最長的為8個。因此,Action及其泛型委托可以匹配無返回值、參數(shù)數(shù)量為0到8的任何函數(shù)。同樣的,F(xiàn)unc泛型委托可以匹配由返回值、參數(shù)數(shù)量在0到8個的任何函數(shù)。一般情況下,程序中函數(shù)的參數(shù)數(shù)量都不會超過8個,即使超過8個,我們可以聲明新的泛型委托類型來應對
復制代碼 代碼如下:

delegate void Action<T1, T2, T3, T4, T5, T6, T7, T8, T9>(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8, T9 p9);

使用這些泛型委托不會有任何的性能損失,使得程序中委托的使用風格保持一致。唯一的缺點就是類型的名稱無法表達具體的用途,舉例來講EventHandler委托,我們一看名字就知道這是用于事件處理的委托。而使用Action<object,EventArgs>委托我們則無法從名稱看出這種類型的委托是何種用途。
泛型委托有替代所有其它委托的能力,到底應該使用泛型委托還是普通委托、何時使用、在哪種情況下用,可能每個人都有不同的簡介,不過說到底,泛型委托能統(tǒng)一程序代碼風格以及隨處方便使用等優(yōu)點是非常顯著的。

相關文章

  • .net非托管資源的回收方法

    .net非托管資源的回收方法

    這篇文章主要介紹了.net非托管資源的回收方法,以實例形式詳細分析歸納了.net非托管資源的兩種回收方法,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-10-10
  • C#.NET發(fā)送郵件的實例代碼

    C#.NET發(fā)送郵件的實例代碼

    這篇文章介紹了C#.NET發(fā)送郵件的實例代碼,有需要的朋友可以參考一下,希望對你有所幫助
    2013-07-07
  • 幾種using 的用法小結

    幾種using 的用法小結

    本文介紹了,幾種using 的使用方法,需要的朋友可以參考一下
    2013-03-03
  • asp.net提取多層嵌套json數(shù)據(jù)的方法

    asp.net提取多層嵌套json數(shù)據(jù)的方法

    這篇文章主要介紹了asp.net提取多層嵌套json數(shù)據(jù)的方法,結合實例形式較為詳細的分析了asp.net解析json格式數(shù)據(jù)的步驟與相關操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • .NET Core自定義項目模板的全過程

    .NET Core自定義項目模板的全過程

    這篇文章主要給大家介紹了關于.NET Core自定義項目模板的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • Ajax實現(xiàn)評論中頂和踩功能的實例代碼

    Ajax實現(xiàn)評論中頂和踩功能的實例代碼

    這算是社團布置的一個假期小作業(yè)吧,我只是提出我自己的解決方案,不一定是最合適的。
    2013-04-04
  • Visual Studio 2017新版發(fā)布 更強大!

    Visual Studio 2017新版發(fā)布 更強大!

    Visual Studio 2017新版發(fā)布 更強大!對Visual Studio 2017感興趣的小伙伴們可以參考一下
    2017-05-05
  • ASP.NET配置文件中自定義節(jié)點

    ASP.NET配置文件中自定義節(jié)點

    這篇文章介紹了ASP.NET配置文件中自定義節(jié)點的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • asp.net MaxLengthValidator 最大長度驗證控件代碼

    asp.net MaxLengthValidator 最大長度驗證控件代碼

    如果數(shù)據(jù)庫字段為varchar或char類型,ASP.NET控件在可輸入漢字的情況下,MaxLength屬性不能保證在保存到數(shù)據(jù)庫時不發(fā)生截斷錯誤,因此寫了一個最大長度驗證控件,還可用于多行文本框。
    2009-12-12
  • Asp.net靜態(tài)方法之Grid轉DataTable方法實現(xiàn)步驟

    Asp.net靜態(tài)方法之Grid轉DataTable方法實現(xiàn)步驟

    GridView綁定DataTable后,如何獲取GridView綁定后顯示的值,在項目需求的背景下寫了一個靜態(tài)方法,經(jīng)過在項目中的使用,bug的修復,較為穩(wěn)定
    2013-04-04

最新評論