C#中多重委托(MulticastDelegate)的例子

using System;

namespace SEI.DL88250.SourceCodes.CSharp
{
 public delegate void Calculation(decimal val1,
                                  decimal val2,
             ref decimal result);
 class MulticastDelegate
 {
  Calculation MyAdd;
  Calculation MySub;
  Calculation MyMul;

  public void Add(decimal add1, decimal add2, ref decimal result)
  {
   result = add1 + add2;
   Console.WriteLine("{0} + {1} = {2}",
       add1, add2, result);
  }

  public void Sub(decimal sub1, decimal sub2, ref decimal result)
  {
   result = sub1 - sub2;
   Console.WriteLine("{0} - {1} = {2}",
       sub1, sub2, result);
  }

  public void Mul(decimal mul1, decimal mul2, ref decimal result)
  {
   result = mul1 * mul2;
   Console.WriteLine("{0} * {1} = {2}",
       mul1, mul2, result);
  }

  static void Main(string[] args)
  {
   decimal result = 0.0m;
   MulticastDelegate mcd = new MulticastDelegate();

   mcd.MyAdd = new Calculation(mcd.Add);
   mcd.MySub = new Calculation(mcd.Sub);
   mcd.MyMul = new Calculation(mcd.Mul);

   Console.ForegroundColor = ConsoleColor.DarkRed;
   Console.WriteLine("Use Single Delegate: ");
   Console.ForegroundColor = ConsoleColor.DarkGray;
   mcd.MyAdd(7.43m, 5.19m, ref result);
   mcd.MySub(7.43m, 5.19m, ref result);
   mcd.MyMul(7.43m, 5.19m, ref result);

   Console.ForegroundColor = ConsoleColor.DarkRed;
   Console.WriteLine("Use Multicast Delegate: ");
   Console.ForegroundColor = ConsoleColor.DarkGray;
   Calculation MultiCalc = mcd.MyAdd + mcd.MySub + mcd.MyMul;
   MultiCalc(7.43m, 5.19m, ref result);

   Console.ForegroundColor = ConsoleColor.DarkRed;
   Console.WriteLine("Remove the Sub method Delegate: ");
   Console.ForegroundColor = ConsoleColor.DarkGray;
   MultiCalc -= mcd.MySub;
   MultiCalc(7.43m, 5.19m, ref result);

   // restore Delegate Sub method
   MultiCalc += mcd.MySub;

   Console.ForegroundColor = ConsoleColor.DarkRed;
   Console.WriteLine("Delegate contents: ");
   Console.ForegroundColor = ConsoleColor.DarkGray;
   Delegate[] delegateArray = MultiCalc.GetInvocationList();
   foreach (Delegate delgt in delegateArray)
   {
    Console.WriteLine(delgt.Method.GetBaseDefinition());
   }
   Console.ForegroundColor = ConsoleColor.White;
  }
 }
}
 

 

时间: 2024-12-22 08:35:14

C#中多重委托(MulticastDelegate)的例子的相关文章

[unity3d]unity中C#委托的应用

C#中有一种还是挺实用的类型,就是委托类型,这也是初学者比较难理解的类型,我们常常将委托和事件合起来讲,其实他们两是有些区别的,委托(delegate)是一种类型,而事件(Event)是一种实例(委托中的一种).下面我就从参考网上的一个例子,讲解一下unity中C#委托的应用. 我们新建一个脚本,取名TestDelegate.这个主要的功能就是点击中文按钮输出中文名字,点击英文按钮输出英文名字.这里有两个函数分别实现了这两个功能.如果不用委托,可以用if else,switch来实现,相比新手用

《C#多线程编程实战(原书第2版)》——3.2 在线程池中调用委托

3.2 在线程池中调用委托 本节将展示在线程池中如何异步的执行委托.另外,我们将讨论一个叫做异步编程模型(Asynchronous Programming Model,简称APM)的方式,这是.NET历史中第一个异步编程模式. 3.2.1 准备工作 为了学习本节,你需要安装Visual Studio 2015.除此之外无需其他准备.本节的源代码放置在BookSamples\Chapter3\Recipe1目录中. 3.2.2 实现方式 请执行以下步骤来了解如何在线程池中调用委托: 1.启动Vis

javascript中事件委托和this面试题

JavaScript不仅门槛低,而且是一门有趣.功能强大和非常重要的语言.各行各业的人发现自己最混乱的选择是JavaSscript编程语言.由于有着各种各样的背景,所以不是每个人都对JavaScript及其基本原理有广泛的认识.通常来书,除非你去参加工作面试才会去思考为什么或者怎么做,否则JavaScript只是你工作的内容. 这个系类的目标是深入探讨JavaScript的一些概念和理论.主题来自于 Darcy Clarke的JavaScript典型面试问题列表.希望你不仅仅是为了答案而阅读完这

mysql中字符串索引问题与例子

  字符串索引与数字索引有一些方面如果没做好会非常的慢了,今天我们就一起来看看小编整理的一些mysql中字符串索引问题与例子了,因为字符索引相对来说也简单文章就简单的整理了一些例子,希望对各位有帮助. 事情的起因是线上日志发现的mysql慢查询.100万数据量的标准,联合查询全部走索引的情况下,尽然要600多毫秒.很不解,但是将索引列由varchar(50)型改为bigint型后,数据提升了30倍.究其原因就索引树上搜索时要进行大量的比较操作,而字符串的比较比整数的比较耗时的多. 所以建议一般情

异常-java核心技术中一个关于数组的例子不理解,请教大家

问题描述 java核心技术中一个关于数组的例子不理解,请教大家 Person是Employer的父类,Employer有个新方法setBonus,代码如下 Employer[] emprs ={new Employer("张三"),new Employer("李四")}; Person[] ps =emprs; ps[0] = new Person("小明");//运行时该行报错ArrayStoreException emprs[0].setBo

在HTML中实现bidi支持的例子

通过对比 Unicode 控制字符和 HTML 标记,读者可以了解在 Web 中实现文字方向性控制的两种方法以及其各自特点.本文使用在 HTML 中实现 bidi 支持的例子更能让读者对 bidi 在 Web 中的实现拥有更加直观和 深入的理解. 在开始介绍 bidi 算法和其在 HTML 中的实现之前,我们先来了解一下文字.语言和方向的关系,这也将有助于在后文中更好地理解 bidi 算法. 什么是文字和语言呢?我们引用 IBM Terminology 中的定义: 文字是使用于书面语的图形符号的

线程-爬虫crawler4j中,运行里面的例子就出现错误。错误如下

问题描述 爬虫crawler4j中,运行里面的例子就出现错误.错误如下 Exception in thread "main" java.lang.UnsupportedClassVersionError: edu/uci/ics/crawler4j/crawler/CrawlConfig : Unsupported major.minor version 51.0 解决方案 JDK版本的问题,你使用了低版本的JDK,修正开发环境的jdk版本. 问题参考:http://blog.csdn

java web-求大神给个Java web工程中怎么实现权限的例子

问题描述 求大神给个Java web工程中怎么实现权限的例子 求大神给个Java web工程中怎么实现权限的例子(最好使用了 Struts). 解决方案 http://blog.csdn.net/wangzihu/article/details/7653244 解决方案二: http://canann.iteye.com/blog/1929180 参考Shiro,独立的权限框架. 解决方案三: http://edu.51cto.com/lesson/id-36761.html 解决方案四: ht

javascript天生就具备类似c#中的"委托"功能

今天读了Professional Javascript for Web Developers,才知道javascript天生就具备类似c#中的"委托"功能 <script type="text/javascript">//定义一个加法函数function fnAdd(){    var iResult = 0;    for(var i=0;i<arguments.length;i++){        iResult += arguments[i