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,那么它的这些方法就不会被自动调用,没法走生命周期。

相关推荐
“抚琴”的人14 小时前
【机械视觉】C#+VisionPro联合编程———【六、visionPro连接工业相机设备】
c#·工业相机·visionpro·机械视觉
omegayy16 小时前
Unity 2022.3.x部分Android设备播放视频黑屏问题
android·unity·视频播放·黑屏
FAREWELL0007516 小时前
C#核心学习(七)面向对象--封装(6)C#中的拓展方法与运算符重载: 让代码更“聪明”的魔法
学习·c#·面向对象·运算符重载·oop·拓展方法
CodeCraft Studio17 小时前
Excel处理控件Spire.XLS系列教程:C# 合并、或取消合并 Excel 单元格
前端·c#·excel
勘察加熊人18 小时前
forms实现连连看
c#
hvinsion18 小时前
PPT助手:一款集计时、远程控制与多屏切换于一身的PPT辅助工具
c#·powerpoint·ppt·ppt助手·ppt翻页
weixin_3077791320 小时前
使用C#实现从Hive的CREATE TABLE语句中提取分区字段名和数据类型
开发语言·数据仓库·hive·c#
时光追逐者20 小时前
在 Blazor 中使用 Chart.js 快速创建数据可视化图表
开发语言·javascript·信息可视化·c#·.net·blazor
与火星的孩子对话21 小时前
Unity3D开发AI桌面精灵/宠物系列 【三】 语音识别 ASR 技术、语音转文本多平台 - 支持科大讯飞、百度等 C# 开发
人工智能·unity·c#·游戏引擎·语音识别·宠物
response_L21 小时前
国产系统统信uos和麒麟v10在线打开word给表格赋值
java·c#·word·信创·在线编辑