作者:KillerAery 出处:http://www.cnblogs.com/KillerAery/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
1.委托delegate

//声明没有参数,没有返回值的委托类型XXXX
public delegate void XXXX();
//委托类型XXXX的对象
public XXXX delegateObj1;public void func1(){}
public void func2(){}
public void func3(int a){}
//可将某个同样类型的函数赋给该对象
delegateObj1 = func1;//调用委托对象等同于调用它代表的函数
delegateObj1();//等价于func1();delegateObj1 = func2;
delegateObj1();//等价于func2();delegateObj1 = func3;//类型不匹配,语法错误

2.event(事件)
单纯用委托的话只能一对一调用(一次调用,一个函数触发)。
而通过利用事件机制,我们可以实现一对多的调用(一次调用,多个相关事件(函数)触发)。
而且它添加/移除委托对象(相当于观察者模式里的观察者)的操作十分方便,使用+=或-=即可。

//先声明一个委托类型
public delegate void XXXX();
//委托事件对象
public event XXXX EventObj1;//此处比一般委托多了个event
EventObj1 += func1; //添加
EventObj1 += func2; //添加EventObj1(); //调用func1(),func2()EventObj1 -= func1; //移除
EventObj1(); //调用func2()

3.Action/Func
Action/Func主要是为了简化委托(delegate)语法,它们本质都是委托。

//无返还值,不带参数的委托对象
public delegate void XXXX();
public XXXX obj1;
//无返还值,不带参数的委托对象
public Action obj3;
//无返还值,带int参数的委托对象
public Action<int> obj4;//double返还值,无参数的委托对象
public Func<double> obj5;
//int返还值,带string,double参数的委托对象
public Func<string,double,int> obj6;//将Action应用至事件
public event Action<int> EventObj1;
EventObj1 += obj4;
EventObj1 += func1;
EventObj1 += func2;
EventObj1();//调用obj4(),func1(),func2()

结论
为了简化语法,可使用Action/Func而不是直接使用delegate,除非你想强调特殊的委托类型。
实现观察者模式,可以使用event和委托(Action/Func/delegate)搭配。更加完善的做法则是再搭配Dictionary,通过Key找到想要的委托事件对象列表,然后可以添加/移除/通知该对象的观察者。

Unity3d:委托、事件、Action相关推荐

  1. Delegate,Action,Func,匿名方法,匿名委托,事件 (转载)

    Delegate,Action,Func,匿名方法,匿名委托,事件 (转载) 一.委托Delegate 一般的方法(Method)中,我们的参数总是string,int,DateTime...这些基本 ...

  2. Unity C#笔记 委托事件

    C#的委托与事件搭配,即是观察者模式的一种实现. 因为观察者模式的原理很易懂,不作多讲,本文纯粹用于记录语法. delegate(委托) //声明没有参数,没有返回值的委托类型XXXX public ...

  3. [UnityC#事件委托]对委托事件的学习与实践

    很多人对 委托 事件 进行了 写文章,本文不一定是最好的,但是是 最"看图识字"的. ----------------------------------------------- ...

  4. C# 利用委托事件进行窗体间的传值

    引言: 窗体间传值是每个学习WinForm新手的常见问题,最初级的方法就是 在窗体中先获取到要接受值窗体.然后通过.得到某个空间或者属性,直接赋值,这个需要接收放的窗体属性或者空间必须是public ...

  5. c#_委托事件的理解

    我找了三篇写的比较不错的博客,希望对委托和事件的理解有所帮助: 第一篇: 将方法作为方法的参数 我们先不管这个标题如何的绕口,也不管委托究竟是个什么东西,来看下面这两个最简单的方法,它们不过是在屏幕上 ...

  6. C#中的三种委托方式:Func委托,Action委托,Predicate委托

    C#中的三种委托方式:Func委托,Action委托,Predicate委托. Func,Action,Predicate全面解析 首先来说明Func委托,通过MSDN我们可以了解到,Func委托有如 ...

  7. 委托事件实现更新窗体

    委托 和 事件在 .Net Framework中的应用非常广泛. 委托( Delegate ):是一种定义方法签名(只有方法的名字,没有方法体),可以与具有兼容的签名的任何方法关联.所谓兼容的方法,是 ...

  8. [转载]c#委托事件简单例子

    c#委托事件简单例子 2009-05-11 10:57 一.委托委托类似于函数指针,但函数指针只能引用静态方法,而委托既能引用静态方法,也能引用实例方法. 委托使用分三步:1.委托声明.2.委托实例化 ...

  9. C# 委托事件传递参数

    关于委托传值的总结,每天总结一点点,每天进步一点点 这里尝试了串口通讯委托,虽然本来就有,但是自己练习一下还是好的. //定义一个委托public delegate void serialPortHa ...

最新文章

  1. OpenCV+python:读取图片
  2. 下拉菜单连动效果的一种用法
  3. android读取外部图片,Android读取本地图库与调用摄像头拍摄
  4. 安装了ros后Python3 调用import cv2报错解决办法:
  5. vue组件调用(全局调用和局部调用)
  6. react学习(71)--render使用
  7. SkipList 以及高度的确定
  8. Linux截图工具import使用说明
  9. 山东CIO智库会员参观徐工信息公司
  10. 统计数据库中各个表和空间使用情况
  11. 511遇见易语言列表框去重复项目到列表框
  12. android 截图root权限,为什么 Android 截屏需要 root 权限
  13. 刷题记录:牛客NC23803DongDong认亲戚
  14. android日期时间的获取与时差计算
  15. IPv6基础知识总结
  16. 智能宠物饲养系统设计
  17. unity可以直接转h5吗_Unity对H5小游戏开发的支持—Project Tiny
  18. html水平线段hr标记详解,HTML标记【水平分隔线hr标记的使用】!
  19. phpstudy启动MySQL服务遇到的问题及解决过程
  20. zsh: corrupt history file /home/csi/.zsh_history

热门文章

  1. 求职面试的几点建议(肺腑之言)
  2. LOL英雄联盟赏金术士蛮王单挑1V5
  3. 为何NFC移动支付技术未火就已走向衰败
  4. 两款新奇无缝柔性屏幕iPhone概念机
  5. 美文鉴赏-《我们从哪里来,到哪里去?》
  6. css flex布局自动换行
  7. 阿里云ubuntu部署javaweb项目
  8. max日期最大值为0_Excel中的MAX,这5种不一样的使用技巧,看你知道几个
  9. android设置文本大小属性,TextView文本属性设置
  10. 关于10055 No buffer space available的调试