• C# - 委托、事件、Action、Func


    前言:所有的名词,都是基于委托产生的

    委托 (delegate

    解释:

            其实就是一种指定格式的函数模版(容器)

            这个模版(容器)可以用来存放各种格式和它相同的函数(的引用)

            比如指定类型参数 指定参数个数 指定返回值等等

    定义:

            public delegate void MyDelegate();

    使用:

           

    1. private MyDelegate m_DelegateAction;
    2. m_DelegateAction = Func1;
    3. m_DelegateAction?.invoke()
    4. m_DelegateAction += Func2;
    5. m_DelegateAction += Func3;
    6. m_DelegateAction?.invoke()
    7. m_DelegateAction -= Func2;
    8. m_DelegateAction -= Func3;
    9. m_DelegateAction?.invoke()

    事件(Event)

    解释:

            event是一种具有特殊签名delegate

            event的实现依赖于delegate

            用在定义delegate对象时,在前部加上event签名

    定义:

            private event MyDelegate m_DelegateAction;

    使用:        

            

    1. private MyDelegate m_DelegateAction;
    2. //在自身类中(声明 event 的类中):可以执行 = + -
    3. m_DelegateAction = Func1;
    4. m_DelegateAction?.invoke()
    5. m_DelegateAction += Func2;
    6. m_DelegateAction += Func3;
    7. m_DelegateAction?.invoke()
    8. m_DelegateAction -= Func2;
    9. m_DelegateAction -= Func3;
    10. m_DelegateAction?.invoke()
    11. //在其他类中:只能执行 + -
    12. m_DelegateAction += Func2;
    13. m_DelegateAction += Func3;
    14. m_DelegateAction?.invoke()
    15. m_DelegateAction -= Func2;
    16. m_DelegateAction -= Func3;
    17. m_DelegateAction?.invoke()

    与delegate的区别:

            使用event签名的delegate对象,直接赋值(=)的操作会变成 private 权限

            += 和 -= 是重写变成了 add 和 remove 的方法,是 public 的,所以可以在外部调用

    好处:

            可以防止外部直接赋值导致所有的注册丢失,有一定的安全性

    Action 

    解释:

            Action 就是一个 System 库自带的无even签名、’无返回值的委托

            

    Func 

    解释:

            Func 就是一个 System 库自带的无even签名、具有泛型返回值的委托

  • 相关阅读:
    react native引用原生组件时无法显示的问题处理
    Java 设计模式——外观模式
    java毕业设计员工工资管理系统Mybatis+系统+数据库+调试部署
    Linux文件和文件夹命令详解
    Node 版本切换工具之 NVM 安装及使用教程
    rocketMQ简单理解
    17. 最小化可变性
    【无标题】好消息 突破:IM开源项目OpenIM采用wasm技术实现jssdk
    nginx反向代理动静分离和负载均衡
    RK806电源方案的PCB设计注意事项
  • 原文地址:https://blog.csdn.net/smile_otl/article/details/134414411