当前位置: 首页 > news >正文

C# Action和delegate区别及示例代码

Action和delegate类似但没有返回值

Action和delegate在C#编程语言中有明显的区别,主要体现在它们的定义、用途和特性上。

1. 定义

  • Delegate:Delegate是C#中用于定义方法签名的类型,它允许将方法作为参数传递,或者将方法赋值给变量。Delegate是一种类型安全的函数指针,至少可以有0个参数,最多可以有32个参数,并且既可以没有返回值,也可以指定返回值类型。
  • Action:Action是C#中的一个泛型委托,它特别用于表示无返回值的方法。Action至少可以有0个参数,最多可以有16个参数,且这些方法都不应该有返回值。Action内部实际也是使用delegate实现的,但当普通的delegate定义的参数与Action的个数、类型一致时,Action提供了一种更简洁、规范的表示方式。

2. 用途

  • Delegate:由于其灵活性和强大的功能,Delegate在C#中被广泛用于回调方法、事件处理、异步编程等场景。它可以引用任何与定义的方法签名相匹配的方法,包括静态方法和实例方法。
  • Action:Action主要用于表示那些执行某些操作但不返回任何结果的方法。它简化了无返回值方法的委托声明,使得代码更加简洁易读。在需要传递无返回值方法作为参数或返回值的场景中,Action是一个很好的选择。

3. 特性

  • Delegate:具有高度的灵活性和可重用性,可以引用多种类型的方法,包括静态方法和实例方法。同时,Delegate支持链式调用(通过+-操作符),允许将多个委托组合成一个委托链。
  • Action:作为无返回值的泛型委托,Action提供了一种更简洁、规范的表示方式。与普通的Delegate相比,它在声明和使用时更加直观和方便。此外,由于Action的泛型特性,它还可以轻松地处理不同数量和类型的参数。

4. 示例

  • Delegate示例

    public delegate int AddDelegate(int a, int b);  
    public static int Add(int a, int b) { return a + b; }  AddDelegate del = new AddDelegate(Add);  
    int result = del(1, 2); // 结果为3
  • Action示例

    Action<int, int> act = (a, b) => Console.WriteLine(a + b);  
    act(1, 2); // 输出3

类似函数指针,代码示例

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ActionDemo : MonoBehaviour
{Action  action;//表示无参Action<int> action1;//表示有传入参数intvoid Start(){action = actionH1;//没有参数action();action1 = actionH2;//一个 int参数 action1(456);actionH3(() => { Debug.Log("执行完actionH3了"); });//lambda 表达式 来执行委托actionH3(actionH4);//执行完 actionH3后回调 actionH4方法}private void actionH1()//没有参数{Debug.Log(123);}private void actionH2(int index)//参数int{Debug.Log(index);}private void actionH3(Action act)//参数 Action{Debug.Log("在执行actionH3");act();//回调 这个 委托方法}private void actionH4()//执行完 actionH3后的回调执行{Debug.Log("执行完actionH3了");}
}

综上所述,Action和Delegate在C#中各有其独特的定义、用途和特性。选择使用哪一个主要取决于具体的编程需求和场景。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • tb的数数问题(牛客小白月赛)
  • Vue3新组件transition(动画过渡)
  • ubuntu18.04升级到20.04
  • 【JavaScript】LeetCode:41-45
  • Python 低层多线程接口_thread的用法
  • Unity UGUI的核心渲染组件
  • Linux 内存管理机制概述
  • 整合多方大佬博客以及视频 一文读懂 servlet
  • 数值计算 --- 平方根倒数快速算法(中)
  • 邮件安全治理
  • CVE-2024-2389 未经身份验证的命令注入
  • (PySpark)RDD实验实战——取一个数组的中间值
  • 树和二叉树的概念以及结构
  • Flink难点和高阶面试题:Flink的状态管理机制如何保证数据处理的准确性和完整性
  • 解决Mac下Vscode编译运行C语言程序会自动生成DSYM文件夹的问题
  • [iOS]Core Data浅析一 -- 启用Core Data
  • Centos6.8 使用rpm安装mysql5.7
  • CSS 专业技巧
  • Druid 在有赞的实践
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • es的写入过程
  • Gradle 5.0 正式版发布
  • k8s 面向应用开发者的基础命令
  • mysql中InnoDB引擎中页的概念
  • nodejs调试方法
  • node和express搭建代理服务器(源码)
  • php的插入排序,通过双层for循环
  • rabbitmq延迟消息示例
  • rc-form之最单纯情况
  • scala基础语法(二)
  • vue的全局变量和全局拦截请求器
  • vue总结
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 什么是Javascript函数节流?
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​香农与信息论三大定律
  • #Datawhale AI夏令营第4期#多模态大模型复盘
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #pragam once 和 #ifndef 预编译头
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (12)Linux 常见的三种进程状态
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (ros//EnvironmentVariables)ros环境变量
  • (补充):java各种进制、原码、反码、补码和文本、图像、音频在计算机中的存储方式
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (黑马C++)L06 重载与继承
  • (剑指Offer)面试题34:丑数
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (转载)利用webkit抓取动态网页和链接
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始