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

C#關(guān)于Func和Action委托的介紹詳解

 更新時間:2022年02月21日 09:52:03   作者:風(fēng),停下  
委托是存有對某個方法的引用的一種引用類型變量,本文主要介紹了C#關(guān)于Func和Action委托的介紹,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

委托:委托(Delegate) 是存有對某個方法的引用的一種引用類型變量。引用可在運行時被改變。

委托(Delegate)特別用于實現(xiàn)事件和回調(diào)方法。所有的委托(Delegate)都派生自 System.Delegate 類。

1.Action委托

沒有返回值,可以不包含參數(shù)

(1)聲明委托、定位委托事件、向委托添加事件、執(zhí)行委托

/// <summary>
/// 不包含參數(shù)
/// </summary>
private event Action Action_0;
/// <summary>
/// 包含一個參數(shù)
/// </summary>
private event Action<int> Action_1;
/// <summary>
/// 包含兩個參數(shù)
/// </summary>
private event Action<int, double> Action_2;
/// <summary>
/// 包含三個參數(shù)
/// </summary>
private event Action<int, double, string> Action_3;

/// <summary>
/// 定義沒有參數(shù)委托的事件
/// </summary>
private void Fun_0()
{
    Console.WriteLine("沒有參數(shù)");
}
/// <summary>
/// 定義包含一個參數(shù)委托的事件
/// </summary>
private void Fun_1(int nInt)
{
    Console.WriteLine($"包含一個參數(shù):{nInt}");
}
/// <summary>
/// 定義包含兩個參數(shù)委托的事件
/// </summary>
private void Fun_2(int nInt, double dDouble)
{
    Console.WriteLine($"包含兩個參數(shù),參數(shù)值:{nInt},{dDouble}");
}
/// <summary>
/// 定義包含三個參數(shù)委托的事件
/// </summary>
private void Fun_3(int nInt, double dDouble, string str)
{
    Console.WriteLine($"包含三個參數(shù),參數(shù)值:{nInt},{dDouble},{str}");
}


//點擊事件
private void btn_Click(object sender, EventArgs e)
{
    //向委托添加事件
    Action_0 += Fun_0;
    Action_1 += Fun_1;
    Action_2 += Fun_2;
    Action_3 += Fun_3;

    //執(zhí)行委托
    Action_0.Invoke();
    Action_1.Invoke(666);
    Action_2.Invoke(666,888.0);
    Action_3.Invoke(666,888,"Hello World");
}

輸出結(jié)果:

在這里插入圖片描述

由于btn_Click為點擊事件,點擊第二次(第二次點擊會再次向委托添加事件)的數(shù)據(jù)結(jié)果如下:

在這里插入圖片描述

因此,向委托添加事件時,一個事件僅添加一次即可,若進(jìn)行多次添加則調(diào)用委托時會將添加進(jìn)入委托的所有事件進(jìn)行調(diào)用,無論該事件是否已添加都會進(jìn)行調(diào)用,故做如下處理(在構(gòu)造函數(shù)中或在程序啟動時添加委托事件):

在這里插入圖片描述

上圖中委托調(diào)用時提示波浪線,因為是委托在調(diào)用時可能未添加事件,將會拋出:未將對象引用設(shè)置到對象的實例的異常信息,

異常信息:

在這里插入圖片描述

故調(diào)用時進(jìn)行異常處理或做如下處理:

處理方案1:

private void button1_Click(object sender, EventArgs e)
{
    Action_0?.Invoke();
    Action_1?.Invoke(666);
    Action_2?.Invoke(666, 888.0);
    Action_3?.Invoke(666, 888, "Hello World");
}

處理方案2

//執(zhí)行委托
private void button1_Click(object sender, EventArgs e)
{
    try
    {
        Action_0.Invoke();
        Action_1.Invoke(666);
        Action_2.Invoke(666, 888.0);
        Action_3.Invoke(666, 888, "Hello World");
    }
    catch (Exception ex)
    {
        MessageBox.Show("調(diào)用出現(xiàn)異常", "提示");
    }
}

此時,我們已經(jīng)學(xué)會了Action委托的簡單使用,這時會有人考慮到,我想調(diào)用完返回信息Action委托并沒有返回,會限制我們的使用,不要著急,我們系統(tǒng)已經(jīng)幫我們準(zhǔn)備了一個現(xiàn)成的委托類型Func,下面我們對Func做個介紹。

2.Func委托

話不多說,上代碼,以下我們定義了包含兩個參數(shù)int和double,返回值為string類型的Func委托,并添加了兩個事件Fun_1和Fun_2:

public partial class Form1 : Form
{

    /// <summary>
    /// 包含兩個參數(shù)int和double,返回值為string類型委托
    /// </summary>
    private event Func<int, double, string> TestFunc;

    /// <summary>
    /// 定義委托的事件
    /// </summary>
    private string Fun_1(int nInt, double dDouble)
    {
        Console.WriteLine($"參數(shù)值:{nInt},{dDouble}");
        return "事件:Fun_1";
    }
    /// <summary>
    /// 定義委托的事件
    /// </summary>
    private string Fun_2(int nInt, double dDouble)
    {
        Console.WriteLine($"參數(shù)值:{nInt},{dDouble}");
        return "事件:Fun_2";
    }

    /// <summary>
    /// 窗體構(gòu)造函數(shù)
    /// </summary>
    public Form1()
    {
        InitializeComponent();
        InitAction();
    }

    //向委托添加事件
    private void InitAction()
    {
        TestFunc += Fun_1;
        TestFunc += Fun_2;
    }

    //執(zhí)行委托
    private void button1_Click(object sender, EventArgs e)
    {
        var result = TestFunc?.Invoke(888, 10);
        Console.WriteLine($"返回結(jié)果:{result}");
    }

}

輸出結(jié)果:

在這里插入圖片描述

從輸出結(jié)果不難看出向委托添加多個事件(委托的多播或組播),委托包含返回值時,僅得到最后向委托添加的事件(方法)的返回值,所以在使用有返回值時必須注意這一點。

以下為先添加Fun_2后添加Fun_1的返回結(jié)果:

在這里插入圖片描述

到這里,委托的介紹我們已經(jīng)介紹完了,更多相關(guān)C# Func 和Action 委托內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Unity Shader實現(xiàn)序列幀動畫效果

    Unity Shader實現(xiàn)序列幀動畫效果

    這篇文章主要為大家詳細(xì)介紹了Unity Shader實現(xiàn)序列幀動畫效果 ,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • C#向PPT文檔插入圖片以及導(dǎo)出圖片的實例

    C#向PPT文檔插入圖片以及導(dǎo)出圖片的實例

    PowerPoint演示文稿是我們?nèi)粘9ぷ髦谐S玫霓k公軟件之一,本篇文章介紹了C#向PPT文檔插入圖片以及導(dǎo)出圖片的實例,非常具有實用價值,需要的朋友可以參考下。
    2016-12-12
  • C#利用Refit實現(xiàn)JWT自動續(xù)期詳解

    C#利用Refit實現(xiàn)JWT自動續(xù)期詳解

    Refit?是一個受到Square的Retrofit庫(Java)啟發(fā)的自動類型安全REST庫,這篇文章主要為大家介紹了C#如何利用Refit實現(xiàn)JWT自動續(xù)期,感興趣的可以了解下
    2023-08-08
  • C#生成本地配置文件的實現(xiàn)示例

    C#生成本地配置文件的實現(xiàn)示例

    本文將介紹如何使用C#語言生成本地配置文件,以便為應(yīng)用程序提供靈活的配置選項,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • c# StringBuilder.Replace 方法 (Char, Char, Int32, Int32)

    c# StringBuilder.Replace 方法 (Char, Char, Int32, Int32)

    c# StringBuilder.Replace 方法 (Char, Char, Int32, Int32)...
    2007-08-08
  • Unity實現(xiàn)背景圖片淡入淡出效果

    Unity實現(xiàn)背景圖片淡入淡出效果

    這篇文章主要為大家詳細(xì)介紹了Unity實現(xiàn)背景圖片淡入淡出,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • C#復(fù)合模式(Composite Pattern)實例教程

    C#復(fù)合模式(Composite Pattern)實例教程

    這篇文章主要介紹了C#復(fù)合模式(Composite Pattern),以實例形式講述了復(fù)合模式在樹形結(jié)構(gòu)中的應(yīng)用,需要的朋友可以參考下
    2014-09-09
  • c#操作ftp類分享

    c#操作ftp類分享

    這篇文章主要介紹了一個c#操作ftp的類,大家參考使用吧
    2014-01-01
  • C#定義簡單的反射工廠實例分析

    C#定義簡單的反射工廠實例分析

    這篇文章主要介紹了C#定義簡單的反射工廠的用法,實例分析了反射工廠的原理與使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • C#定時每天00點00分00秒自動重啟軟件

    C#定時每天00點00分00秒自動重啟軟件

    這篇文章主要為大家詳細(xì)介紹了C#定時每天00點00分00秒自動重啟軟件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08

最新評論

灌云县| 霍邱县| 泰来县| 章丘市| 盐源县| 宝丰县| 大余县| 滨州市| 武穴市| 碌曲县| 斗六市| 卓尼县| 柏乡县| 长白| 贡山| 岐山县| 元阳县| 清新县| 安乡县| 太仓市| 中江县| 曲沃县| 庄河市| 云霄县| 鸡东县| 土默特左旗| 昆山市| 普宁市| 嘉定区| 文化| 息烽县| 江城| 南部县| 和政县| 平山县| 阳江市| 正阳县| 昭觉县| 盐津县| 旬阳县| 陈巴尔虎旗|