C#的委托与事件搭配,即是观察者模式的一种实现。

因为观察者模式的原理很易懂,不作多讲,本文纯粹用于记录语法。

delegate(委托)

//声明没有参数,没有返回值的委托类型XXXX
public delegate void XXXX();

声明一个委托类型(类似typedef XXXX C++/C的函数类型)

注:不是产生一个对象。

然后利用声明出来的委托类型,我们可以利用它的对象,赋予其对应类型的函数。
从而实现出类似调用函数指针的效果。

//委托类型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;//类型不匹配,语法错误

event(事件)

单纯用委托的话只能一对一调用(一次调用,一个函数触发)。

而通过利用事件机制,我们可以实现一对多的调用(一次调用,多个相关事件(函数)触发)。

而且它添加/移除委托对象(相当于观察者模式里的观察者)的操作十分方便,使用+=或-=即可。

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

Action/Func

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

//无返还值,不带参数的委托对象
public delegate void XXXX();
public XXXX obj1;

在上面我们看到委托语法,必须为委托类型命名(声明委托),才能使用该委托类型。

但是使用Action/Func可以无需声明委托类型的语句,直接利用Action<...>/Func<...>来用自己想要的委托类型。

Action和Func的源码底层实际也是delegate的封装

  • Action<...>用于无返还值的委托类型
  • Func<...,T>用于有返回值的委托类型,最后一个类型参数 T 代表返还值类型。
//无返还值,不带参数的委托对象
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()

Lambda表达式

Lambda表达式是用于简便快速写简单函数的语法,而且这些函数往往要用于委托对象。

Lambda表达式基本形式:

(参数...) => { 函数内容... }

参数在它的类型可自动推导的情况下,才可以省略参数类型。如果谨慎起见,可以不省略,从而避免隐式类型转换。

Action obj1;
obj1 = () => { Debug.Log("FGNB"); };Action<int> obj2;
obj2 = (int x) => { Debug.Log(x); };
obj2 = (x) => { Debug.Log(x+233); };//也可以省略参数类型Func<int,int> obj3 = (int x) => { return x; };

小结

  • 大部分情况下可使用Action/Func而不是直接使用delegate
  • 要观察者模式,应使用event和委托(Action/Func/delegate)搭配。更加完善的做法是再搭配Dictionary,通过Key找到想要的事件委托对象,然后可以添加/移除/通知该对象的观察者。
  • Lambda表达式适用于快速编写简短的函数,复杂的应该做成类方法方便调试。

转载于:https://www.cnblogs.com/KillerAery/p/10509940.html

Unity C#笔记 委托事件相关推荐

  1. Unity初学者笔记——input事件

    我是小白,如果文章有错误的地方,请多多包涵,望指教. 关于input事件: input事件负责处理输入事件,包括键盘输入.鼠标输入.手柄输入等等.我这里记录一些比较常用的input的方法. (1)鼠标 ...

  2. Unity 入门笔记 - 05 - 动画事件类音效对话框

    Unity 入门笔记 - 05 - 动画事件&类&音效&对话框 前言:无 目录 Unity 入门笔记 - 05 - 动画事件&类&音效&对话框 一.动画 ...

  3. Mr.J-- jQuery学习笔记(十一)--事件委托

    jQuery事件委托 事件委托是利用事件冒泡,只指定一个事件处理程序来管理某一类型的所有事件. 为什么要用事件委托? 1.在JavaScript中添加到页面上的事件处理程序的个数直接关系到页面的整体运 ...

  4. 【Unity学习笔记】[Unity中文课堂教程] C#中级编程代码

    [Unity学习笔记][Unity中文课堂教程] C#中级编程代码 最近想补一补C#基础,Unity官方的C#中级编程教程质量很高,于是开个帖子把跟着敲+记录了部分价讲解和我自己的理解的代码存在这 原 ...

  5. 【Unity学习笔记】b站Unity架构课Unity3D 商业化的网络游戏架构(高级/主程级别)

    [Unity学习笔记]b站Unity架构课Unity3D 商业化的网络游戏架构(高级/主程级别) 自己跟着学完了,写了不少代码,会放在CSDN代码库,因为老师并没有提供源码,录屏也不是完全连续,所以难 ...

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

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

  7. Unity 入门笔记 - 07(完) - 菜单手机端静态类生成游戏

    Unity 入门笔记 - 07(完) - 菜单&手机端&静态类&生成游戏 前言:入门笔记的最后一篇.这个系列教程看完了.接下来有空就看例子项目,动手做点东西. 目录 Unity ...

  8. Unity 项目中委托Delegate用法案例

    Unity中Delegate的用法场景 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人! (拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar ...

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

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

最新文章

  1. 三电平igbt死区时间计算_IGBT基础与运用知识
  2. 中国人民大学_《组织行为学》_17.节点人物
  3. 数据库设计的第三范式
  4. 二十、预处理CSS的LESS
  5. Android自动化页面测速在美团的实践
  6. NVelocity标签使用详解
  7. bzoj1257: [CQOI2007]余数之和sum
  8. cmd怎么使用post请求’_flutter中dio的post请求方式使用总结
  9. php图像生成和处理,PHP的gd库(图像生成和处理)的应用
  10. 数据系统 需要的服务器配置,数据系统 需要的服务器配置
  11. flash无法注册控件
  12. PAIP.http post 400错误
  13. python调用adb shell命令_python(或BAT脚本)自动执行adb shell以后的命令
  14. HackerRank Word Order
  15. 大江大河未来10年:中国人改变命运的的七次机遇
  16. 数论概论 第三章 勾股数组与单位圆
  17. 小程序接入h5页面_微信小程序跳转外部链接(h5页面)以及数据交互
  18. EMI-EMC设计注意事项
  19. python分析就业率_Python就业行情和前景分析之一
  20. 数制转换 1207 1216

热门文章

  1. 熊猫DataFrame groupby()函数
  2. 百家与g对比oogle_如何在Java Web应用程序中集成G​​oogle reCAPTCHA
  3. 熊猫DataFrame from_dict()–字典到DataFrame
  4. 使用BroadcastReceiver的Android IntentService
  5. shell学习之跳出循环
  6. “猿式浪漫”:Java小白也能写出的表白程序
  7. Linux Crontab定时任务
  8. windows生成当前目录树
  9. Struts(十一):OGNL表达式(二)
  10. HEL上清除Oracle10g clusterware的失败安装