当前位置:首页 » 《随便一记》 » 正文

C#关于Func和Action委托的介绍

11 人参与  2022年11月09日 11:37  分类 : 《随便一记》  评论

点击全文阅读


委托:委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。

委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。

1.Action委托

没有返回值,可以不包含参数

(1)声明委托、定位委托事件、向委托添加事件、执行委托

/// <summary>/// 不包含参数/// </summary>private event Action Action_0;/// <summary>/// 包含一个参数/// </summary>private event Action<int> Action_1;/// <summary>/// 包含两个参数/// </summary>private event Action<int, double> Action_2;/// <summary>/// 包含三个参数/// </summary>private event Action<int, double, string> Action_3;/// <summary>/// 定义没有参数委托的事件/// </summary>private void Fun_0(){    Console.WriteLine("没有参数");}/// <summary>/// 定义包含一个参数委托的事件/// </summary>private void Fun_1(int nInt){    Console.WriteLine($"包含一个参数:{nInt}");}/// <summary>/// 定义包含两个参数委托的事件/// </summary>private void Fun_2(int nInt, double dDouble){    Console.WriteLine($"包含两个参数,参数值:{nInt},{dDouble}");}/// <summary>/// 定义包含三个参数委托的事件/// </summary>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{    /// <summary>    /// 包含两个参数int和double,返回值为string类型委托    /// </summary>    private event Func<int, double, string> TestFunc;    /// <summary>    /// 定义委托的事件    /// </summary>    private string Fun_1(int nInt, double dDouble)    {        Console.WriteLine($"参数值:{nInt},{dDouble}");        return "事件:Fun_1";    }    /// <summary>    /// 定义委托的事件    /// </summary>    private string Fun_2(int nInt, double dDouble)    {        Console.WriteLine($"参数值:{nInt},{dDouble}");        return "事件:Fun_2";    }    /// <summary>    /// 窗体构造函数    /// </summary>    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的返回结果:
在这里插入图片描述
到这里,委托的介绍我们已经介绍完了,如果您看了觉得有用记得点赞哟。


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/47627.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 繁花盛意难平全书+后续+结局(陆依霜轩辕翊)全书列表_繁花盛意难平(陆依霜轩辕翊)繁花盛意难平全书+后续+结局在线
  • 全球灾变:我有一座恐怖屋全文免费在线阅读_[钟无咎林澜]全文免费无弹窗阅读_笔趣阁
  • 「乖巧面具撕碎那天,全网求我别黑化」章节多结局预体验‌_宋且微萧淮无弹窗阅读
  • (番外)+(全书)日暮青山绿渐隐全书+后续+结局(日暮青山绿渐隐全书+后续+结局)_许星森纪冰雪列表_笔趣阁(日暮青山绿渐隐全书+后续+结局)
  • [我预见了所有悲剧,除了爱]最新章节在线阅读_「白月光」小说无删减版在线免费阅读
  • (番外)+(全书)爱若有天意,兜转终可回全书+后续+结局(宋清澜萧沉)_爱若有天意,兜转终可回全书+后续+结局列表_笔趣阁(爱若有天意,兜转终可回全书+后续+结局)
  • [繁花盛意难平]小说节选推荐_陆依霜轩辕翊陆青仪节选推荐
  • [纵她追悔,爱已成荒芜]小说精彩节选推荐_「苏萌林澈白月光」小说精彩节选试读
  • [老婆让我别拦着她嫁豪门]小说节选免费试读_[屈英哲韩海雪温文尔雅]精彩章节分享
  • 青梅诱人竹马男主轻点宠(许嘉易顾思瑜)全书浏览_青梅诱人竹马男主轻点宠全书浏览
  • 阮雾梨闻砚辞人面桃花长相忆结局+番外(阮雾梨闻砚辞)_人面桃花长相忆结局+番外阮雾梨闻砚辞列表_笔趣阁(阮雾梨闻砚辞)
  • 人面桃花长相忆闻砚辞结局+番外+续集(阮雾梨闻砚辞)结局_(阮雾梨闻砚辞人面桃花长相忆闻砚辞结局+番外+续集全书结局)结局(阮雾梨闻砚辞)

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1