delegate(委托),Event(事件),Action,Func

delegate(委托)是函数的容器,会定义一个函数的模板。

csharp 复制代码
public delegate void xxxx()

Event(事件)本质上也是Delegate,但是赋值的权限设置成了Private

csharp 复制代码
public event xxxx delegate1()

Action是delegate的简写,是C#给我们封装好的一种写法

csharp 复制代码
public Action xxxx()

Func既可以执行函数,也可以获得返回值,其括号内最后一个类型就是返回值

delegate例子:

csharp 复制代码
public delegate void Help(int a);  // 委托(函数的容器)
csharp 复制代码
public class testooo : Singleton<testooo>
{
    public Help p;  // 将委托实例化
    public void Hello(int a)
    {
        Debug.Log(a);
    }
}
csharp 复制代码
public class TestSendMsg : MonoBehaviour
{
    void Start()
    {
        Help p;
        p = testooo.Instance.Hello;
        p?.Invoke(1008666);
    }
}

Action其实就是C#把定义委托和将委托实例化封装成一句代码了,效果是一样的:

csharp 复制代码
public class testooo : Singleton<testooo>
{
    public Action<int> p;  // 同时定义委托和将委托实例化
    public void Hello(int a)
    {
        Debug.Log(a);
    }
}
csharp 复制代码
public class TestSendMsg : MonoBehaviour
{
    void Start()
    {
        Action<int> p;
        p = testooo.Instance.Hello;
        p?.Invoke(1008666);
    }
}

event:

csharp 复制代码
public delegate void Help(int a);  // 委托(函数的容器)
csharp 复制代码
public class testooo : Singleton<testooo>
{
    public event Help p;  // 将委托实例化

    private void Start()
    {
        p = Hello;
        p?.Invoke(1);
    } 

    public void Hello(int a)
    {
        Debug.Log(a);
    }
}

在其它类中无法对testooo类的p进行赋值。

csharp 复制代码
public class TestSendMsg : MonoBehaviour
{
    Help p;
    void Start()
    {
        testooo.Instance.p = eee;  // 这是会报错的
    }
}

Func:

csharp 复制代码
public class testooo : Singleton<testooo>
{
    public Func<int, int> p;  // 将委托实例化

    public void Start()
    {
        p = Hello;
        Debug.Log("^^^^^^^^^^^^^^^^^^^^");
    }

    public int Hello(int a)
    {
        return a * 10;
    }
}
csharp 复制代码
public class TestSendMsg : MonoBehaviour
{
    void Start()
    {
        testooo.Instance.Start();//因为是不继承mono的单例所以要调用一下
        Debug.LogError(testooo.Instance.p(1));
    }
}

输出结果:

复制代码
10

注意:继承mono的单例中的生命周期方法(Awake,Start,Update)都是走的unity的生命周期。但是如果单例没有继承mono,那么它的这些方法就不会被自动调用,没法走生命周期。

相关推荐
mudtools2 分钟前
.NET驾驭Word之力:理解Word对象模型核心 (Application, Document, Range)
c#·.net
SmalBox5 小时前
【光照】Unity中的[经验模型]
unity·渲染
大飞pkz6 小时前
【设计模式】C#反射实现抽象工厂模式
设计模式·c#·抽象工厂模式·c#反射·c#反射实现抽象工厂模式
萘柰奈6 小时前
Unity学习----【进阶】TextMeshPro学习(三)--进阶知识点(TMP基础设置,材质球相关,两个辅助工具类)
学习·unity
Yasin Chen7 小时前
Unity UI坐标说明
ui·unity
唐青枫8 小时前
从入门到进阶:C#.NET Stopwatch 计时与性能测量全攻略
c#·.net
陈言必行12 小时前
Unity 性能优化 之 编辑器创建资源优化( 工作流 | 场景 | 预制体)
unity·编辑器·游戏引擎
未来之窗软件服务17 小时前
幽冥大陆(二)RDIFSDK 接口文档:布草洗涤厂高效运营的技术桥梁C#—东方仙盟
开发语言·c#·rdif·仙盟创梦ide·东方仙盟
1uther18 小时前
Unity核心概念⑨:Screen
开发语言·游戏·unity·c#·游戏引擎
阿幸软件杂货间19 小时前
Office转PDF转换器v1.0.py
开发语言·pdf·c#