Delegate总结

2023-11-10

关于Delegate已经写了很多,现总结如下。

一) 一条线是观察delegate从.net framework 1.1 到目前为止4.5的变迁;

例如如果你用delegate来模拟事件,你需要自己:

          // Add member to the invocation list.

       public void OnAboutToBlow(AboutToBlow clientMethod)

       { almostDeadList += clientMethod; }

而在.NET Framework 1.1中你可以:

         //服务端代码:

         publicclass Car

   {

       // This delegate works in conjunction with the

       // Car’s events.

       public delegate voidCarEventHandler(string msg);

 

       // This car can send these events.

       public event CarEventHandler Exploded;

       public event CarEventHandler AboutToBlow;

          }

          //客户端代码:

     // Register event handlers.         

    c1.AboutToBlow +=new Car.CarEventHandler(CarIsAlmostDoomed);

 

而在.NET Framework 2.0中:

    //服务端代码:

        public classCarPlus

   {

       public event EventHandler<CarEventArgs> Exploded;

       public event EventHandler<CarEventArgs> AboutToBlow;

          }

         //客户端代码:

         // Make a car as usual.

   CarPlus c1 =new CarPlus("SlugBug", 100, 10);

   // Register event handlers.         

   c1.AboutToBlow += CarIsAlmostDoomed;

   c1.AboutToBlow += CarAboutToBlow;

 

而在.NET Framework 3.0之后:

可以仔细体会Delegate与泛型,lambda表达式等的结合。Action, Func等的引入。Asynchronous Delegate等。

二)一条线是理解其意图(Intention)和几种应用的典型模式。

无论是对Document还是对Car的处理(这些都是书上列举的经典示例用来说明Delegate),会发现一个共同点。尽管有许多不同的方法,例如WashCar, RotateTire等,但它们的signature是一样的,有一个唯一的参数即Car。这里需要处理两个变化,一是这些类似的方法可能会增加;一是用户使用的时候对这些方法是任意组合的。之前的类图包括Garage, Car, 现在引入委托后变为Garage, Car, ServiceDepartment。仔细体会这个模式是如何处理前面所述的两个变化的。方法增加用户可以通过扩充ServiceDepartment来实现,客户端调用时的任意性则用Delegate来实现。

另一个应用delegate的典型场景是Strategy pattern。例如排序,用户通常需要根据实际情况动态选择排序算法,这就需要排序逻辑isolate出来。这个在LINQ中应用及其广泛,例如where子句中的predicate谓词逻辑都需要隔离出来由用户决定。

还有一个典型场景就是用Delegate来模拟Event。事实上这个场景都可以用event来实现,而将所需传递的信息封装在EventArgs中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Delegate总结 的相关文章

随机推荐

  • vue中实现微信公众号支付

    最近做项目遇到微信支付 根据项目需求使用了微信h5支付 大概的流程介绍 1 配置微信公众号 2 静默授权 获取路径中code 3 根据code拿到openid 4 根据openid获取prepay id 5 获取支付签名 6 调起支付功能
  • C++查找子串string.find()与string::npos

    string find string str abc string subStr1 bc string subStr2 cd str find subStr1 返回1 第一个匹配的下标 str find subStr2 返回string n
  • python 初始化列表的四种方法

    这里以 初始化大小为20个元素的列表 每个元素初始化为0 来举例说明 方法一 使用for循环和append 创建一个空的列表 使用append 方法通过f or循环n次 来将元素添加到列表中 arr for i in range 20 ar
  • 13-2 静态链接库的构建和使用

    1 静态链接库与动态链接库 程序编译时发生的动作称为静态行为 程序运行时发生的动作称为动态行为 故链接共分为两种 静态链接和动态链接 目前来看 链接使用的原因在于 主程序文件执行时需要引入头文件 执行外部函数 而引入头文件时 在编译阶段确定
  • pytorch loss.backward问题:RuntimeError: element 0 of tensors does not require grad and does not have a

    最近遇到了一个问题 在pytorch定义模型 训练过程中 反向传播时 loss backward 在上面这个未知报错 RuntimeError element 0 of tensors does not require grad and d
  • ssd检测坏块工具_如何看SSD还能用多久 固态硬盘寿命如何检测【详细介绍】

    理论上来说 固态硬盘的寿命要比机械硬盘短 不过SSD抗震性强 实际运用寿命不一定比HDD差 不过 固态硬盘一旦破坏很难维修 数据无法向机械硬盘那样 可以较为容易的恢复 因此在运用中 很多用户都会担心固态硬盘的运用寿命问题 那么 怎么看SSD
  • Quartus II软件添加设备

    文章目录 前言 一 前期准备 二 进入网站并下载对应的 qdz文件 1 先进入Intel主页并登录账号 2 找到下载地址 Quartus软件中添加设备 前言 最近为了调试Cyclone V系列的一个FPGA 安装了Quartus II 17
  • 服务器安装系统一直打圈,服务器宕机的造成原因和解决方法介绍

    服务器宕机原因是什么 怎么解决 服务器宕机是什么原因造成的 服务器宕机它的解决方法是什么 服务器宕机的造成原因和解决方法介绍 随着如今互联网信息化时代的不断发展 数据存储和传输在各种网络科技面前也显得越来越重要 选择一款好用的服务器愈发重要
  • matlab中使用bp神经网络完成分类问题

    训练集 27 2500矩阵 训练集有2500个样本 每个样本27个属性 矩阵的每一列表示一个样本集 标签 30 2500矩阵 对应2500个标签 30类 若为该类 则该类数字为1 其余为零 例 1 0 0 0 四类中的类一 神经网络训练 l
  • 具体数学第二版第一章习题(1)

    1 当 n 2 时 区间 2 n 1 为空 所以当 n 2 时不能证明2匹马颜色相同 2 三根柱子ABC 假设 n 个盘子的答案为 f n 最后一个盘子一定是A gt C gt B 所以整个过程分为5步 1 将上面 n 1 个盘子从A gt
  • 前端vue中箭头函数省略return的写法之详细讲解

    1 什么括号都不用的情况 a b gt return a b 简化 a b gt a b 2 使用 的情况下 let arr arr map item gt return h1 科科 h1 简化 arr map item gt h1 科科
  • The type java.util.Map$Entry cannot be resolved. It is indirectly referenced from required .class fi

    今天在家编写代码的时候 提示如下错误信息 The type java util Map Entry cannot be resolved It is indirectly referenced from required class fil
  • 【Python】如何根据时间序列数据提取星期几的信息?(如2023-04-05提取为Wednesday)

    一 问题描述 在Python中 可以使用datetime模块来处理日期和时间数据 并从中提取星期几 以下是一个示例代码 import datetime 定义一个日期字符串 date string 2023 04 05 将日期字符串转换为日期
  • 关键路径求法

    关键路径概念 在无回路的有向网络中 假设只有一个入度为0的顶点 称为源点 和一个出度为0的顶点 称为汇点 则从源点到汇点之间的最长的路径称为关键路径 AOE网 无回路有向网络可以用来表示一个包含多项活动的工程计划 有向边表示一项活动 边上的
  • 请教100位行业专家后,我总结出第三方支付“断直连”的8大疑问!

    2018年4月11日 央行行长易纲在博鳌亚洲论坛上表示 中国的第三方支付是走在世界前列的 但行业在发展过程中也出现了一些风险 如何在有效防范风险的同时鼓励竞争 鼓励创新 这是一个挺难解的题目 要做好平衡 断直连 监管细则已经落地 市场格局和
  • mysql 配置多个数据库连接_SpringBoot和Mybatis配置多数据源连接多个数据库

    目前业界操作数据库的框架一般是 Mybatis 但在很多业务场景下 我们需要在一个工程里配置多个数据源来实现业务逻辑 在SpringBoot中也可以实现多数据源并配合Mybatis框架编写xml文件来执行SQL 在SpringBoot中 配
  • 浅谈ChatGPT在一个IT运维人眼中的日常使用场景

    前言 其实AI的概念已经存在了十多年 包括在运维领域 也从传统运维演化到了所有AIOps的概念 但一直以来对当前的AI并不是太看好 始终觉得当前的AI只是停留在 撞库 从海量的库里去匹配关键字触发语句 所谓的 小爱同学 小度小度 包括Sir
  • 高内聚与低耦合实现小记

    总所周知 实际软件开发中要实现高内聚 低耦合的设计原则 c语言和c 不同 c语言面向过程 c 面向对象 真正的项目中 要对业务升级 原来的业务函数需要保留 要保证老的功能继续维持 不能直接删除 这时候 c语言面向过程 通常使用回调的方法 c
  • 为什么面试狂问Redis,阿里面试官把我问到哑口无言…

    Redis在国内各大公司都很热门 比如新浪 阿里 腾讯 百度 美团 小米等 Redis也是大厂面试最爱问的 尤其是Redis客户端 Redis高级功能 Redis持久化和开发运维常用问题探讨 Redis复制的原理和优化策略 Redis分布式
  • Delegate总结

    关于Delegate已经写了很多 现总结如下 一 一条线是观察delegate从 net framework 1 1 到目前为止4 5的变迁 例如如果你用delegate来模拟事件 你需要自己 Add member to the invoc