目录
一、Action
二、Event
三、Action和Event区别:
四、Delegate
总结:Action Event Delegate的异同
前言:
Action、Event和Delegate都是C#语言中的重要概念,分别用于管理函数指针,并且在某些情况下可以实现相同的目标。
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是一种机制,用于在类中定义和触发事件。它定义了在类的实例中发生的事件,并包含需在订阅它的客户端代码(称为事件处理程序)中执行的代码。事件允许类进行事实的通知,并将事件发布给订阅者,订阅者可以通过订阅/取消订阅事件来注册/注销该事件。例如,定义一个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具有相似的语法方式,但它们彼此的意义和应用场景有所差异。
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都是C#中的关键词,而Delegate则是一个类。
Action和Func之间的区别在于Action没有返回值,而Func具有返回值。
Delegate用于指向方法,而Event用于将事件与订阅器连接起来。
总之,Action、Event和Delegate都是C# 语言中的重要概念,它们各自用于不同场景,他们结合使用,可以减少代码复杂性,并更好地解耦代码。