今天来讲一讲《C#delegate、event、Action、EventHandler的使用和区别》

目录

  • 所以,event应运而生

  • 所以,EventHandler应运而生

  • 所以,Action应运而生

  • 小故事讲解这四位的前世今生

  • 使用

小故事讲解这四位的前世今生

曾经.Net大佬只有一个Delegete(委托),别人想用委托的时候,必须得用delegate关键字来定义一个委托,就像这样

//定义一个无返回值的,带一个int参数的委托public delegate void myDelegate(int num);
  • 1

  • 2

话说,委托生来是为了将方法也作为参数进行传递的。所以后来它学会了发布者/订阅者模式。比如:

public myDelegate m_delegate;m_delegate += MyFun;public void MyFun(int num){  Debug.Log("my func: " + num);}

但是它有一个弊端,delegate可以使用“=”将所有已经订阅的取消(也可以用+/-对订阅合并和删除,这是后话,不讲),只保留=后新的订阅,这给了犯罪分子可乘之机。

m_delegate = MyFun1;  //MyFun订阅被取消,只有MyFun1在订阅中

public void MyFun1(int num){  Debug.Log("my func1: " + num);}

所以,event应运而生

event是一种特殊的委托,它只能+=,-=,不能直接用=

public event myDelegate m_event;m_event += MyFun;m_event = MyFun;  //错误,

通过下面的报错信息可以看出,event在定义类中(发布者)是可以直接=的,但是在其他类中(订阅者)就只能+= -=了,也就是说发布者发布一个事件后,订阅者针对他只能进行自身的订阅和取消。

但是,在事件发布和订阅的过程中,定义事件的原型委托类型常常是一件重复性的工作。

所以,EventHandler应运而生

它的出生就是为了避免这种重复性工作,并建议尽量使用该类型作为事件的原型。

//这是它的定义//@sender: 引发事件的对象//@e: 传递的参数public delegate void EventHandler(object sender, EventArgs e);//使用public event EventHandler m_event;  //修改自定义委托类型为EventHandler

这时候老大哥delegate说了,你event都有小弟了,我也要有,我每次自定义委托的时候也很麻烦的。

所以,Action应运而生

//Action是系统预定义的一种委托,无返回值,参数在<>中传入public Action<int> m_action;//比较下delegate和Action的定义(个人理解)public delegate void myDelegate(int num);public Action<int> m_action;//1,Action省略了void,因为它本身就是无返回值//2, Action的参数在<>中定义的,delegate就是传统定义//3,delegate要用关键字,然后自定义一个委托名字。而Action委托名字已定。不需要delegate关键字。

知道每个类型因何而来,也就知道了应用场景和区别了,接下来是如何使用了。

使用

  
  public class Event1 : MonoBehaviour    {      //delegate        public delegate void myDelegate(int num);        public myDelegate m_delegate;        //event        public event myDelegate m_event;        //EventHandler        public event EventHandler m_EventHandle;        //Action        public Action<int> m_action;        void Start()        {            m_delegate += MyEventFun;            m_delegate(1);            m_delegate = (d) =>{Debug.Log("m_delegate : " + d);};            m_delegate(2);            m_event += MyEventFun;            m_event(3);      //发布者中可直接=            m_event = (d) =>{Debug.Log("m_event : " + d);};            m_event(4);            m_EventHandle += MyEventFun;            m_EventHandle(5, new EventArgs());            m_EventHandle += (o, e) =>{ Debug.Log("m_EventHandle: " + Convert.ToInt32(o) + "\t " + e.ToString());};            m_EventHandle(6, new EventArgs());            m_action += MyEventFun;            m_action(7);            m_action = (d) =>{Debug.Log("m_action : " + d);};            m_action(8);        }        public void MyEventFun(int num)        {            Debug.Log("my func1: " + num);        }        public void MyEventFun(object sender, EventArgs e)        {            Debug.Log("my func2: " + Convert.ToInt32(sender) + "\t " + e.ToString());        }    }

输出:

-----------------------------------------------------------------------------

如果这篇文章对你有帮助,就请多多点击,让更多朋友看到,需要进C#交流群群的请加z438679770,备注进群

c# 带返回值的action_C#知识点讲解之C#delegate、event、Action、EventHandler的使用和区别...相关推荐

  1. c# 带返回值的action_C#委托的介绍(delegate、Action、Func、predicate)

    委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递.事件是一种特殊的委托. 1.委托的声明 (1). delegate delegate我们常用到的一种声明 Delegat ...

  2. c# 带返回值的action_C#委托Action、ActionT、FuncT、PredicateT

    一.Action Action封装的方法没有参数也没有返回值,声明原型为: 1 public delegate void Action(); 用法如下: 1 public void Alert() 2 ...

  3. 定义一个带参带返回值的方法,实现输出随机数数组

    public class mains { public static void main(String[] args) { // 创建对象,对象名为hello mains hello = new ma ...

  4. Java05-day05【方法(概述、调用过程图解)、带参方法、带返回值方法、重载、方法参数传递(基本类型、引用类型)】

    java零基础入门到精通(2019版)[黑马程序员] 视频+资料:[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg   提取码:zjxs] &qu ...

  5. android cursor 实例化,为什么Cursor放到带参数带返回值方法里就报错?

    完整代码如下: 其中有大部分的代码被注释,那是可以成功运行的. 后来我想啊,游戏有好多种,但是需要统计的内容是一样的. 我就想传参 然后获得返回值的方式 来减少代码量啊. 但是把相关的查询代码放到 带 ...

  6. 实验3.1 简单实现Intent带返回值的跳转

    在这里实现的功能是当点击listview的某一子项是,启动一个确认删除相应记录的子Activity. 所以用到了带返回值的intent 父界面和子界面的前台代码 activity_main <? ...

  7. Mysql带返回值与不带返回值的2种存储过程

    过程1:带返回值: 1 drop procedure if exists proc_addNum; 2 create procedure proc_addNum (in x int,in y int, ...

  8. c++中带返回值函数没写return能通过编译但运行时会出现奇怪问题

    c++中带返回值函数没写return能通过编译但运行时会出现奇怪问题 例如: string myFunc(){ theLogics(); } 发现调用: myFunc(); 崩溃. 但调用: cout ...

  9. Java手写线程池(不带返回值、带返回值)

    文章目录 不带返回值 带返回值 不带返回值 public class MyThreadPool {private static final int DEFAULT_THREAD_NUM = 10;pr ...

最新文章

  1. ubuntu14.04上安装python3.6
  2. 说说Broker服务节点、Queue队列、Exchange交换器?
  3. Ajax调用MVC控制器参数为实体
  4. java对象类型有哪些_Java中常用的对象数据类型有哪些?它们分别又占多少个字节呢?...
  5. 2个基础操作案例带你入门MySQL
  6. 关于android 双击事件
  7. bzoj 1049: [HAOI2006]数字序列(DP+DP)
  8. r语言中paste函数_R中的paste()函数-简要指南
  9. Android.mk转换到Android.bp方法
  10. sklearn——决策树基础概念
  11. Atiitt 流水线停顿问题与解决方法 1. 流水线技术方式分类 1 2. 但在实际中,会出现2种情况使流水线停顿下来或不能启动: 2 2.1. 1、多个任务在同一时间周期内争用同一个流水段 2 2
  12. 交大网络教育计算机自测选择题,交大网络计算机组成与系统结构单元自测题.doc...
  13. 世界上最好的学习法:费曼学习法
  14. 《路由器开发 - 路由器刷机指南》优酷路由宝 YK-L1刷机
  15. JavaScript逻辑训练题(一)
  16. Tableau——方向图标的应用
  17. matlab幂法与反幂法,matlab位移反幂法
  18. jquery中的ajax方法请求后台数据
  19. python关于列表去重和删除的方法
  20. 信号量机制实现进程互斥与同步,生产者消费者

热门文章

  1. 社区企业云操作系统 (不错的开源虚拟化系统,期待中)
  2. JS操作iframe
  3. 妙用QTP F1帮助功能
  4. Vsftpd 服务器 问题大全
  5. SharePoint 补丁
  6. chmod +x的意思就是给执行权限
  7. dataframe如何理解df[df[‘type‘]==‘xType‘]
  8. 重学《动手学深度学习》转
  9. 出国读博前希望有人告诉我
  10. 智源社区2022新版体验:订阅讲座日历、关注顶尖专家、开启个人频道