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# 语言中的重要概念,它们各自用于不同场景,他们结合使用,可以减少代码复杂性,并更好地解耦代码。


猜你喜欢

转载自blog.csdn.net/lejian/article/details/131274230