委托、多播委托(MulticastDelegate)

多播委托(MulticastDelegate)继承自 Delegate ,表示多路广播委托;即,其调用列表中可以拥有多个元素的委托。实际上,我们自定义的委托的基类就是 MulticastDelegate。

在 C 或 C++ 中与委托最为相似的是函数指针。委托可以表示静态方法或实例方法。当委托表示实例方法时,委托不仅存储对方法入口点的引用,还存储对类实例的引用。与函数指针不同,委托是面向对象和类型安全的。

多播委托具有一个带有链接的委托列表,称为调用列表,在对委托实例进行调用的时候,将按列表中的委托顺序进行同步调用。

在实际应用中,如果我们要改变通常的事件广播的方式时,就需要应用这一特性了。比如通常我们都是这样触发一个事件广播:

方法 MyEventMethod1 和 MyEventMethod2 将先后被调用。

可是,在上面定义的委托 MyEventHandle 是有返回值的,上面的方式调用(string result = MyEvent("John");)之后返回的是哪一个方法的返回值呢?当然是最后一个 MyEventMethod2 。

但如果我们需要获得所有方法的返回值该怎么办?

还有,假如在调用 MyEventMethod1 时方法内部抛出异常,这将导致后面的方法无法得到执行。那我们如果要求不管被调用的方法无论是否抛出错误,都要保证列表中的所有方法必须得到调用,那该怎么办?

针对这两种场景,我们就得自己实现对多播委托的调用列表中的每个委托进行逐个调用了。

Delegate 的API中提供了一个方法供我们获得调用列表:

    

通过逐个调用委托即可:

Delegate[] delegList = MyEvent.GetInvocationList();
List<string> resultList = new List<string>();
foreach (MyEventHandle del in delgtList)
{
try
{
resultList.Add(del("John"));
}
catch (Exception ex)
{
//异常处理;
}
}

public override sealed Delegate[] GetInvocationList()

事件触发代码

public delegate string MyEventHandle(string name);

public static event MyEventHandle MyEvent;

static void Main(string[] args)
{
MyEvent += new MyEventHandle(MyEventMethod1);
MyEvent += new MyEventHandle(MyEventMethod2);
MyEvent("John");
}

转载于:https://www.cnblogs.com/jackytang/p/9400731.html

委托、多播委托(MulticastDelegate)相关推荐

  1. Unreal多播委托

    相对于单播委托,多播委托可以绑定多个函数,不支持绑定有返回值函数: 无参多播委托 定义委托类型: 声明委托变量: 绑定函数: 广播: 有参多播委托,最多支持9个参数 定义委托类型: 声明委托变量: 绑 ...

  2. java委托事件与观察者模式_多播委托与观察者模式联合使用,以及委托与事件的区别...

    首先我们先看一下多播委托: 使用委托时,首先我们声明委托,委托语法一共有四种类型,分别时有参,无参,以及有无参数返回值. 1 public class DelegateShow //: System. ...

  3. 委托、lamda表达式..委托概念-匿名函数-泛型委托-Lamda表达式-多播委托

    委托 一.什么是委托? 将一个方法作为参数传递给另一个方法(参数类型为委托delegate).   声明一个委托类型. 委托所指向的函数必须跟委托具有相同的的签名(参数个数.参数类型.返回值一样). ...

  4. 用boost.signal实现多播委托

    使用boost.signal boost.signal提供了一个多播委托机制,通过它可以非常容易的实现观察者模式: void print_sum(float x, float y)     {     ...

  5. 第九节:委托和事件(1)(委托的发展历史、插件式编程、多播委托)

    一. 委托的发展历史和基本用法 说起委托,每个人可能都会对他有不同的理解,结合实战中委托的使用,我对其理解是:委托和类一样,是用户的一个自定义类型,委托可以有参数.有返回值,委托的关键字是delega ...

  6. 多播委托(multicast delegate)

    还是老规矩,先看代码:) using System; class MulticastTester {     delegate void Greeting();          public sta ...

  7. 转载-C#委托之多播委托( 二)

    通过一个委托调用多个方法可能导致一个大问题,多播委托包含一个逐个调用的委托集合,如果通过委托调用的其中一个方法抛出一个异常,整个迭代就会停止 示例如下:Action为无参委托 static void ...

  8. C#笔记11多播委托、事件、设计模式(观察者模式)

    文章目录 多播委托 初步理解多播委托为委托列表 报社发报案例 增加接口编程改善案例 再用委托类型对上例进行改善 委托链的异常 事件 提供封装,程序更健壮 提供更加抽象的事件用法 System.Even ...

  9. 很久没上来写点东西了,今天把N年前的代码看了一遍。随手写了点寄托哀思--多播委托...

    using  System; // 委托类似于C++中的函数指针,不同的是委托可以包含一个顺序的委托集合. // 在C#类型封装中,对于不同类型的单个函数的暴露建议使用委托而不要使用接口. // 委托 ...

最新文章

  1. Android开机启动流程初探
  2. redis 缓存 key常量命名规则
  3. python搭建环境的心得体会_python学习第一天_环境的搭建
  4. Shiro学习总结(2)——Apache Shiro快速入门教程
  5. JBPM工作流(八)——流程实例(PI)Process Instance
  6. MEncoder的基础用法—6.1. 选择编解码器及容器格式
  7. Python中for循环之range、enumerate函数
  8. xshell中重启指令_xshell常用命令大全
  9. OpenCV中出现“Microsoft C++ 异常: cv::Exception,位于内存位置 0x0000005C8ECFFA80 处。”的异常
  10. 为什么计算机软件比一般作品较多,插画-从入门到进阶的小心得
  11. Ubuntu 鼠标手势软件 -- EasyStroke
  12. linux c 获取usb vid,Linux使用libudev获取USB设备VID及PID的方法
  13. BZOJ 3240 [Noi2013] 矩阵游戏 题解
  14. 2022「第二届中国RPA+AI开发者大赛」正式收官
  15. ASP.NET建筑工程管理系统
  16. linux系统无需设置密码自动登录用户
  17. 微信域名防封技术,我们应该如何解决屏蔽拦截
  18. SpringMVC05:AJAX的使用
  19. 系统测试常见类型及说明
  20. 单位增益缓冲器的反馈路径中电阻的作用是什么?

热门文章

  1. C#高级编程----错误和异常的总结
  2. 伟大的密码胜于利剑——RSA2012成都站掠影
  3. TreeView控件中实现拖拽的功能
  4. OpenSSH升级安装步骤(redhat)
  5. 博途v15做上位画面_realme真我V15评测:当科技遇上国潮 越级还能这么玩
  6. FPGA的IP软核、硬核以及固核
  7. 用Visio制作周行事历
  8. 欢迎使用markdown编辑器20181206
  9. dearpygui-0.6.6 以前的蛇变成了这个样子
  10. Swift标识符和keyword