我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

委托:委托(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的返回结果:

在这里插入图片描述

到这里,委托的介绍我们已经介绍完了,更多相关C# Func 和Action 委托内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

详解C#中delegate/event/EventHandler/Action/Func的使用和区别

这篇文章主要为大家详细介绍了C#中delegate、event、EventHandler、Action和Func的使用与区别,文中的示例代码讲解详细,感兴趣的可以了解一下
2023-05-14

关于java中类和对象的详细介绍

类和对象对象我们知道,代表现实世界中可以明确标识的一个实体(万物皆对象),每个对象都有自己独特的标识、状态和行为。类是具有相似特征和行为的事物的统称。使用一个通用类来定义同一类型的对象。 类是一个模板 、蓝本或者说是合约 , 用来定义对象的数据域是什么以及方法
关于java中类和对象的详细介绍
2015-06-07

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录