unity: C#的Action Event Delegate的异同

2023-11-20

目录

一、Action

二、Event

三、Action和Event区别:

四、Delegate

总结:Action Event Delegate的异同


前言:

Action、Event和Delegate都是C#语言中的重要概念,分别用于管理函数指针,并且在某些情况下可以实现相同的目标。


一、Action

Action是一种函数指针类型,它指向一个没有参数和返回值的函数。它主要用于封装一些不需要参数和返回值的动作:

Action action = new Action(MyFunction);
action();

Action作为预定义的无返回值委托类型,通常用于表示一个无参无返回值的函数指针。例如:

using UnityEngine;
using System;

public class Example : MonoBehaviour
{
    //定义一个无参的Action类型
    public Action action;

    void Start()
    {
        //定义一个匿名函数赋值给action,此处不需要写括号,因为无参
        action = () => Debug.Log("Hello World!");
    }

    void Update()
    {
        // 每10秒触发一次action
        if (Time.time % 10 == 0 && action != null)
        {
            action.Invoke();
        }
    }
}

上述代码中定义了一个无参的Action类型 action,Start函数中使用lambda表达式Assignment将一个无参且无返回值的函数指针赋值给了他,Update函数中每10秒钟触发一次action的调用。


二、Event

Event是一种机制,用于在类中定义和触发事件。它定义了在类的实例中发生的事件,并包含需在订阅它的客户端代码(称为事件处理程序)中执行的代码。事件允许类进行事实的通知,并将事件发布给订阅者,订阅者可以通过订阅/取消订阅事件来注册/注销该事件。例如,定义一个Click事件: 

public event EventHandler Click;

 Event它允许类进行通知,并将事件发布给订阅方以便订阅方收到通知并执行对应的处理方式。实现Event是使用了委托(例如EventHandler委托类型)。以下是Event的一个简单实例:

using UnityEngine;
using System;

public class Example : MonoBehaviour
{
    //定义一个EventHandler类型的事件
    public event EventHandler action;

    void Start()
    {
        //定义一个匿名函数注册到action中
        action += (sender, e) => Debug.Log("Hello World!");
    }

    void Update()
    {
        if (Time.time % 10 == 0 && action != null)
        {
            // 通过Invoke触发所有订阅方
            action.Invoke(this, EventArgs.Empty);
        }
    }
}

上述代码中定义了一个事件类型 action,使用EventHandler类型定义了事件和订阅方的事件参数,Start函数中使用lambda表达式Assignment将一个无参且无返回值的函数指针注册到了 action中,Update函数中使用EventArgs的实例,使用Invoke触发所有订阅方。


三、Action和Event区别:

Action和Event之间最大的区别在于它们的用途和设计目的。

针对两者的主要不同:

  • Action仅是一个无返回值的函数委托类型,仅用于代表方法,没有事件发布的概念。
  • Event设计用于回调,为对象之间的事件通信提供了机制。

在使用时,当你需要定义一个在某些代码块完成时,执行某个方法的时候使用Action。而通常我们运用 Event 来实现当某个状态变化或者某个条件可满足时,通知订阅对象执行任务的功能。

所以,虽然Action和Event具有相似的语法方式,但它们彼此的意义和应用场景有所差异。


四、Delegate

Delegate是一种引用类,用于引用和调用方法。它可以接受方法作为参数,并将方法存储在成员变量中以便以后调用。使用Delegate的最常见方式是使用Func和Action通用委托类型。 

public delegate int TwoIntOperation(int a, int b);

Delegate主要用于委托模式,同时它也是实现事件和回调的关键机制。以下是一个简单的Delegate例子: 

using UnityEngine;
using System;

public class Calculator
{
    // 声明一个delegate类型
    public delegate int TwoIntOperation(int a, int b);

    // 定义一个方法(加法)
    public int AddTwoInts(int a, int b)
    {
        return a + b;
    }

    // 定义另一个方法(减法)
    public int SubstractTwoInts(int a, int b)
    {
        return a - b;
    }

    //定义一个方法来使用delegate
    public void ApplyOperation(int a, int b, TwoIntOperation operation)
    {
        int result = operation(a, b);
        Debug.Log(result);
    }
}

public class Example : MonoBehaviour
{
    void Start()
    {
        // 实例化Calculator类
        Calculator cal = new Calculator();

        // 创建delegate实例
        Calculator.TwoIntOperation operation;

        //将委托和方法关联并调用
        operation = new Calculator.TwoIntOperation(cal.AddTwoInts);
        cal.ApplyOperation(7, 2, operation);

        operation = new Calculator.TwoIntOperation(cal.SubstractTwoInts);
        cal.ApplyOperation(7, 2, operation);
    }
}

上述代码实例化了Calculator类,并定义了一个delegate类型 TwoIntOperation,包含两个参数,代表两个整数相加或相减的操作。Start函数中将delegate实例化并关联到不同的加法或减法方法,使用ApplyOperation函数调用加法和减法方法,并输出返回值。

以上是在Unity C#中使用Action、Event和Delegate的简单实例,良好的使用这些概念


总结:Action Event Delegate的异同

它们的异同如下:

  • 相同点:

它们都与函数指针相关,并提供了可调用指向方法的代码块的方式。

它们都是用于编写事件驱动和回调代码的通用概念。

它们都可以用于实现委托模式,使触发对象与事件处理程序之间的解耦。

  • 不同点:

Action和Event都是C#中的关键词,而Delegate则是一个类。

Action和Func之间的区别在于Action没有返回值,而Func具有返回值。

Delegate用于指向方法,而Event用于将事件与订阅器连接起来。

总之,Action、Event和Delegate都是C# 语言中的重要概念,它们各自用于不同场景,他们结合使用,可以减少代码复杂性,并更好地解耦代码。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

unity: C#的Action Event Delegate的异同 的相关文章

随机推荐

  • java IO、NIO、AIO详解

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 IO流 同步 阻塞 二 NIO 同步 非阻塞 三 NIO2 异步 非阻塞 正文 回到顶部 概述 在我们学习Java的IO流之前 我们都要了解几个关键词 同步与异步 sy
  • hyperledger fabric介绍

    一 Hyperledger Fabric介绍 2015年 Linux基金会启动了Hyperledger项目 目标是发展跨行业的区块链技术 Hyperledger Fabric是Hyperledger中的一个区块链项目 包含一个账本 使用智能
  • 使用php生成6位密码大全,php生成随机产生六位数密码的代码

    php生成随机产生六位数密码的代码 供大家学习参考 复制代码代码示例 随机产生六位数密码Begin function randStr len 6 format ALL switch format case ALL chars ABCDEFG
  • 《CTF特训营》学习总结——Reverse:逆向分析概述

    一 逆向分析的主要方法 逆向分析主要是将二进制机器码进行反汇编得到汇编代码 在汇编代码的基础上 进行功能分析 经过反编译生成的汇编代码中缺失了源代码中的符号 数据结构等信息 因此需要尽可能地通过逆向分析还原以上信息 以便分析程序原有逻辑和功
  • qt样式表设置边框_QT 样式风格 & 样式表 (QStyleSheet)

    QT Style的机制和GTK的Style机制很类似 基本上就是 定义了一个基础的Style类 在Style类里面定义一系列的绘图相关函数接口 具体风格的Style类实现了这些函数接口 在控件的实现中 控件的绘图函数调用Style类的绘图函
  • 导航电子地图的制作过程

    背景知识 1 导航原理 现代导航通过实时测定运动客体的当前位置及速度 方向等运动参数 以此为基础通过分析和计算 确定若干条符合某些条件要求如 距离 速度 时间 方向 的路线和行驶方案 然后利用系统进行引导和控制客体沿确定路线行驶 并提供必要
  • 软件测试基础——WEB测试模块

    软件测试工程师体系 web测试模块 web测试模块脑图 本文内容以脑图形式展示
  • 什么是接口测试,如何做接口测试?

    比起点点点的功能测试 接口测试 显得专业又高大上 也因此让有些初级测试人员 望而生畏 别担心 其实接口测试也是功能测试的一种 它是针对接口进行的功能测试 写在前面 本文参考了茹炳晟老师的 测试工程师 全栈技术进阶与实践 并结合自己的理解进行
  • Kafka 监控系统Eagle 使用教程 V1.4.0

    1 下载安装zookeeper 2 下载安装kafka 3 下载安装kafka eagle http download kafka eagle org tar zvxf kafka eagle bin 1 4 0 tar gz 4 配置JA
  • 命令注入漏洞(1)

    命令注入漏洞原理 其实命令注入漏洞也叫命令行注入漏洞 此漏洞是指web应用程序中调用了系统可执行命令的函数 而且输入的参数是可控的 如果黑客拼接了注入命令 就可以进行非法操作了 靶机搭建 链接 https pan baidu com s 1
  • 用栈实现括号匹配问题

    通过观察 我们可以发现 括号匹配的字符串 左括号与右括号数目一定相等 且遇到右括号时 必定有与之相匹配的括号在之前最近出现过 这样 可以整理解决问题的思路如下 假设有一串带括号的字符串 依次访问每一个字符 遇到左括号入栈 遇到右括号时 取栈
  • 有关bool(布尔)类型在C语言中的应用

    文章目录 前言 一 bool类型是什么 二 使用举例 总结 前言 由于学习过程中接触到了bool类型 产生了浓厚的兴趣 便写下这一篇文章来阐述bool类型的大概情况 一 bool类型是什么 bool 布尔 是在C99标准中引入的类型 是以英
  • GPT-4来了,但大模型的诸多未解之谜仍然未解

    导语 在3月14日 OpenAI 的 GPT 4 正式发布 它拥有多模态能力 可以接受图像输入并理解图像内容 可接受的文字输入长度增加到 3 2 万个 token 在多种专业和学术基准测试中取得好成绩 然而 功能强大的 GPT 4 与早期的
  • 关于串口调试助手上面的DTR和RTS

    开发调试过程中 突然XCOM串口调试助手无法接发数据 而用了sscom却可以实现正常功能 emo了很久 对比了两个软件对串口的设置 包括波特率 停止位 校验位等设置 也没发现异端 以为是sscom这个软件禁用了XCOM 后来仔细比对发现 X
  • DDR布线要求及拓扑结构分析

    在DDR的PCB设计中 一般需要考虑等长和拓扑结构 等长比较好处理 给出一定的等长精度通常是PCB设计师是能够完成的 但对于不同的速率的DDR 选择合适的拓扑结构非常关键 在DDR布线中经常使用的T型拓扑结构和菊花链拓扑结构 下面主要介绍这
  • 动手学数据分析 Task3

    动手学数据分析 Task3 一 concat merge join 二 groupby 一 concat merge join concat方法可以在两个维度上拼接 默认纵向凭借 axis 0 拼接方式默认外连接 pd concat obj
  • window全局对象的全局变量与脚本的全局变量间的关系

    如果脚本中的变量声明出现在命名元素之前 那这个变量的存在就会组织元素获取他的window属性 而如果脚本中的变量声明出现在命名元素之后 那么变量的显示赋值会覆盖该属性的隐式值
  • 数据库系列MySQL:优化配置文件

    配置流程 1 MySQL文件目录中后缀名为 ini文件的就是MySQL的默认配置文件 2 程序启动会先加载配置文件中的的配置 之后才会真正启动程序 3 更改完配置文件设置后需要重新启动服务端才可以生效 优化方案一 服务器内存 4 8GB k
  • 删除C++ std::string字符串中的空格

    介绍一个使用标准库算法删除std string字符串中空格的方法 代码如下 std string str1 Hello world str1 erase std remove if str1 begin str1 end unsigned
  • unity: C#的Action Event Delegate的异同

    目录 一 Action 二 Event 三 Action和Event区别 四 Delegate 总结 Action Event Delegate的异同 前言 Action Event和Delegate都是C 语言中的重要概念 分别用于管理函