unity: C#的Action Event Delegate的异同

这篇具有很好参考价值的文章主要介绍了unity: C#的Action Event Delegate的异同。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、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# 语言中的重要概念,它们各自用于不同场景,他们结合使用,可以减少代码复杂性,并更好地解耦代码。文章来源地址https://www.toymoban.com/news/detail-525000.html


到了这里,关于unity: C#的Action Event Delegate的异同的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity中Shader的PBR的基础知识与理论

    Unity中Shader的PBR的基础知识与理论 PBR(Physically Based Rendering),中文译为基于物理的渲染 PBR是一种渲染方式 ,是使用基于物理原理和微微、平面理论的光照模型,以及使用从现实中测量的表面参数来准确表示真实世界材质的渲染理念 PBR是一系列技术的集合 ,包含GI、PBS等。 P

    2024年04月26日
    浏览(28)
  • C# 中this.Invoke(delegate)与delegate.Invoke()区别

    在多线程运行中,想要更改UI控件的属性。一直认为两种方式是一样的,以前也是混着写的,这次翻车了。 这个是 在拥有控件的基础窗口句柄的线程上,用指定的自变量列表执行指定委托。 ,也就是说通知UI线程处理事件,可跨线程。 这个是 执行委托,运行在创建委托的线

    2023年04月08日
    浏览(29)
  • 理解C#委托(Delegate)通俗易懂,深入浅出

    委托首先是一个数据类型,我们可以像定义结构体一样定义一个委托类型,委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变 委托的定义 例如: 在定义委托类型时要指定函数的参数类型和返回值,一旦声明了委托类型,委托对象必须使用

    2024年02月02日
    浏览(34)
  • Unity 委托 (Delegate) 的简单理解以及实现

    委托相当于把某一个方法当成参数,当执行委托的时候就相当于执行了方法,所以这个方法必须和委托具有相同的参数类型. 委托的简单实现   输出的结果 多播:委托对象可使用 \\\"+\\\" 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。\\\"-\\\" 运算

    2024年02月16日
    浏览(32)
  • Unity之C#面试题(一)

    内容将会持续更新,有错误的地方欢迎指正,谢谢!   Unity之C#面试题(一)       TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 —— 不断努力,不断进步,不断探索 TechX —— 心探索、心进取! 助力快速掌握 面试题 为面试者节省宝贵的学习时间,避免困惑! 存储

    2024年04月14日
    浏览(16)
  • SQLserver基础入门理论(超基础)

    ♥️ 作者:小刘在C站 ♥️ 个人主页:  小刘主页  ♥️ 努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️ 学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏: 云计算技术 ♥️小刘私信可以随便问,只要会绝不吝啬,感谢CSD

    2024年02月10日
    浏览(39)
  • Java语法和C#语法有哪些异同?

    Java和C#是两种流行的面向对象编程语言,它们有许多相似之处,因为它们都受到C++和面向对象编程的影响。但它们也有一些语法上的异同,让我们来看看它们的一些主要异同点: 相同点: 1、面向对象编程:Java和C#都是面向对象的编程语言,支持类、对象、继承、封装和多态

    2024年02月16日
    浏览(29)
  • 数据库基础理论

    数据:描述事务的符号记录,包含但不限于数字、 文字、图形、图像、声音、语言等。数据有多重形式,它们都可以经过数字化后存入计算机。 数据库:数据仓库。是长期存放在计算机内、有组织、可共享的大量数据的集合。数据库中的数据按照一定数据模型组织、描述和

    2024年01月21日
    浏览(35)
  • 微服务基础理论

    2014,微服务:架构风格(服务微化) 一个应用应该是一组小型服务;可以通过HTTP的方式进行互通; 对应的是过去的单体应用:ALL IN ONE 微服务:每一个功能元素最终都是一个可独立替换和独立升级的软件单元;(和ABB包想法有点儿像,进一步粒化。软件工程在原子化的方向上

    2024年02月15日
    浏览(32)
  • GraphSAGE的基础理论

    引入: GCN的缺点: 从大型网络中学习的困难 :GCN在嵌入训练期间需要所有节点的存在。这不允许批量训练模型。 推广到看不见的节点的困难 :GCN假设单个固定图,要求在一个确定的图中去学习顶点的embedding。但是,在许多实际应用中,需要快速生成看不见的节点的嵌入。

    2023年04月15日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包