日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C#關于Func和Action委托的介紹詳解_C#教程

作者:風,停下 ? 更新時間: 2022-04-25 編程語言

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

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

1.Action委托

沒有返回值,可以不包含參數

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

/// 
/// 不包含參數
/// 
private event Action Action_0;
/// 
/// 包含一個參數
/// 
private event Action Action_1;
/// 
/// 包含兩個參數
/// 
private event Action Action_2;
/// 
/// 包含三個參數
/// 
private event Action Action_3;

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

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

輸出結果:

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

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

異常信息:

在這里插入圖片描述

故調用時進行異常處理或做如下處理:

處理方案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

//執行委托
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("調用出現異常", "提示");
    }
}

此時,我們已經學會了Action委托的簡單使用,這時會有人考慮到,我想調用完返回信息Action委托并沒有返回,會限制我們的使用,不要著急,我們系統已經幫我們準備了一個現成的委托類型Func,下面我們對Func做個介紹。

2.Func委托

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

public partial class Form1 : Form
{

    /// 
    /// 包含兩個參數int和double,返回值為string類型委托
    /// 
    private event Func TestFunc;

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

    /// 
    /// 窗體構造函數
    /// 
    public Form1()
    {
        InitializeComponent();
        InitAction();
    }

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

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

}

輸出結果:

在這里插入圖片描述

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

以下為先添加Fun_2后添加Fun_1的返回結果:

在這里插入圖片描述

原文鏈接:https://blog.csdn.net/weixin_47492910/article/details/122959045

欄目分類
最近更新