什么是委托
  首先要知道什么是委托,用最通俗易懂的话来讲,你就可以把委托看成是用来执行方法(函数)的一个东西。

如何使用委托
  在使用委托的时候,你可以像对待一个类一样对待它。即先声明,再实例化。只是有点不同,类在实例化之后叫对象或实例,但委托在实例化后仍叫委托。

声明,如:

1    namespace Vczx.ProCSharp.Exc
2    {
3        delegate double MathsOp( double x );
4        //class defination here
5    }

  这就声明了一个委托,意义:任何一个返回值为double,且只有一个形参为double的函数,都可以用这个委托来调用。
  注意:委托的声明位置在namespace里面,类的外面。其实,委托的声明也可以在类的里面,甚至是任何一个可以声明类的地方。
  实例化:
  首先我们要先有一个满足委托声明的方法,假设一个返回一个数的2倍的方法:

1class MathsOperations
2{
3    public static double MultiplyBy2( double value )
4    {
5        return value * 2;
6    }
7}

  有了这样一个方法,我们就可以实例化一个委托了:
MathsOp operation = new MathsOp( MathsOperations.MultiplyBy2 );
  在实例化一个委托时,要给它一个参数,这个参数就是委托执行的方法,它可以是静态方法,也可以是实例方法(这一点有别于函数指针,函数指针只能调用静态方法),如:
MathsOp operation = new MathsOp( new Class1().Method1 );

在实例化完一个委托之后,就可以用这个委托来调用方法了:
double result = operation( 1.23 );

例子代码:

 1namespace Vczx.ProCSharp.Exc
 2{
 3    delegate double MathsOp( double x );
 4    class Start
 5    {
 6        public class MyDelegate
 7        {
 8            public static double MultiplyBy2( double x )
 9            {
10                return x * 2;
11            }
12        }
13        [STAThread]
14        static void Main(string[] args)
15        {
16            MathsOp operation = new MathsOp( MyDelegate.MultiplyBy2 );
17            double x = 1.23;
18            double result = operation( x );
19            Console.WriteLine( "{0} multiply by 2 is {1}", x, result ); 
20            Console.Read();
21        }
22    }
23}

多路广播委托
   前面使用的委托只包含一个方法调用。调用委托的次数与调用方法的次数相同。如果要调用多个方法,就需要多次显示调用这个委托。其实委托也可以包含多个方法,这种委托就是多路广播委托。多路广播委托派生于System.MulticastDelegate,它的Combine方法允许把多个方法调用链接在一起,我们可以通过+=来向委托添加调用方法,也可以用-=删除其中的调用方法。如:

 1namespace Vczx.ProCSharp.Exc
 2{
 3    public class MyDelegate
 4    {
 5        public static void MultiplyBy2( double value )
 6        {
 7            double result =  value * 2;
 8            Console.WriteLine( "Multiplying by 2: {0} gives {1}", value, result );
 9        }
10
11        public static void Squre( double value )
12        {
13            double result = value * value;
14            Console.WriteLine( "Squaring: {0} gives {1}", value, result );
15        }
16    }
17
18    delegate void MathsOp( double x );
19
20    class Start
21    {
22        [STAThread]
23        static void Main(string[] args)
24        {
25            MathsOp operation = new MathsOp( MyDelegate.MultiplyBy2 );
26            operation += new MathsOp( MyDelegate.Squre );
27            double x = 1.23;
28            operation( x );
29
30            operation -= new MathsOp( MyDelegate.MultiplyBy2 );
31            operation( x );
32            
33            Console.Read();
34        }
35    }
36}

输出:
Multiplying by 2: 1.23 gives 2.46
Squaring: 1.23 gives 1.5129
Squaring: 1.23 gives 1.5129

  注意,多路广播委托声明时必须返回void,否则返回值不知道应该送回什么地方。对此,我做了一个测试:如果不将委托的声明返回void,则返回值返回的是最后一个链入委托链的方法的返回值,编译不会出错。

为什么要用委托
  使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与C或C++中的函数指针不同,委托是面向对象,而且是类型安全的。

转载于:https://www.cnblogs.com/zzh1236/archive/2012/10/22/2734477.html

C#委托之个人理解(转)相关推荐

  1. 关于C#中委托的一点理解

    C#中委托是一种类型.可以这么笼统的理解:int型变量代表一个整型,而委托类型的变量代表一个方法的地址(将方法名称传入constructor并实例化该委托变量). --By Brisk Yu 1 为何 ...

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

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

  3. C#委托之如何理解委托面试常见题:

    面试常见题: 1.委托是什么?★☆ 2.为什么需要委托?★☆ 3.委托能用来做什么?★☆ 4.如何自定义委托★☆ 5-NET默认的委托类型有哪几种?★☆ 6.怎样使用委托?★★★ 7.多播委托是什么? ...

  4. c# 委托 与事件——委托(加深理解)

    接触c# 已经有段时间,也在项目中历练了一段时间.回头看一看,是时候总结下这段时间的不足,给自己的模糊处,做个标记.首先是: 事件与委托 原因:应用频繁,使用方便 c#委托(Delegate) 首先委 ...

  5. C#之委托的个人理解

    什么是委托 首先要知道什么是委托,用最通俗易懂的话来讲,你就可以把委托看成是用来执行方法(函数)的一个东西. 如何使用委托 在使用委托的时候,你可以像对待一个类一样对待它.即先声明,再实例化.只是有点 ...

  6. UE4 委托(代理)简单理解

    资料来源于: UE4官方文档 UE4 C++ -- 代理 UE4中的代理(Delegate)使用总结 (UE4 4.20)UE4的委托(Delegate)使用 什么是委托Delegates (网上大部 ...

  7. [ASP.NET入门随想七]主角与配角——OO思想的多态、接口与委托

    [ASP.NET入门随想七]主角与配角 --OO思想的多态.接口与委托 曾几何时,我们的父辈接受到的对美好生活的描绘是:"楼上楼下.电灯电话",三十年过去了,电灯电话早已已成为我们 ...

  8. C#规范整理·泛型委托事件

    基于泛型,我们得以将类型参数化,以便更大范围地进行代码复用.同时,它减少了泛型类及泛型方法中的转型,确保了类型安全.委托本身是一种引用类型,它保存的也是托管堆中对象的引用,只不过这个引用比较特殊,它是 ...

  9. C# 委托和事件 (三)

    委托 在C#中,委托(delegate)是一种引用类型,在其他语言中,与委托最接近的是函数指针,但委托不仅存储对方法入口点的引用,还存储对用于调用方法的对象实例的引用. using System; u ...

  10. 面向对象 委托

    委托: 委托:可以理解为是一个函数的容器, 委托指向哪个函数,就代表函数 委托的关键字是delegate 委托跟类class是平级的,需要写在classs外面 Main函数与普通函数不同是总的入口 委 ...

最新文章

  1. 【C++】重载、重写、隐藏
  2. 计算机网络- ARP(地址解析协议)
  3. 赠书 | Python 预测股票价格,竟然这么简单
  4. JDK自带线程池介绍及使用环境
  5. 高校学院计算机实验室管理系统概述,高校实验室管理系统
  6. 常见多媒体文件格式及视音频编解码总结
  7. 用批处理修复 win10 无法升级的问题
  8. [vue] 说说你对SPA单页面的理解,它的优缺点分别是什么?
  9. Java知识点总结(反射-获取类的信息)
  10. dante pam mysql_FreeBSD下安装dante(sockd)并使用pam-pwdfile进行认证
  11. UVA10284 POJ2512 Chessboard in FEN【国际象棋】
  12. java 注解校验_Java开发编写自定义校验注解和校验器
  13. 家谱处理 (30 分)(map映射)
  14. 数字图像处理(21): 图像金字塔(高斯金字塔 与 拉普拉斯金字塔)
  15. 求101到150之间的质数
  16. 解决IE浏览器无法显示VUE项目的方法
  17. LOAP引擎:clickhouse03:文件的导入导出方式
  18. js监听鼠标的滚轮滚动事件
  19. c/s模型和b/s模型
  20. php最小二乘法,Python中实现最小二乘法思路及实现代码

热门文章

  1. 风控中英文术语手册(银行_消费金融信贷业务)_v4
  2. centos如何界面操作mysql_【mysql】centos7下mysql的安装以及基本操作
  3. html go语言,Go 语言基础语法
  4. Pandas:金融数据下载和分析
  5. Xcode证书错误 Provisioning profile does not support the Associated Domains capability
  6. 修改服务器编码和oracle编码,修改oracle 数据服务器编码
  7. 多个计算机之间触发事件,相互通信的一种方法----通过文件的办法
  8. 【数字图像处理系列二】基本概念:亮度、对比度、饱和度、锐化、分辨率
  9. java.nio.file中的Paths类
  10. 【BZOJ 1036】树的统计【树链剖分模板】