四、C#的委托
“.Net以委托的形式实现了函数指针的概念。”——《C#高级编程(第四版)》
现在看这句话,可能笨笨同学就有感觉了。
看书可能就是这样,想当初天山童姥的缥缈峰灵鹫宫里一幅武功秘籍的壁画,她只允许侍女每年进去看一次。虚竹和尚成为灵鹫宫主人,心善允许侍女和他一同进去练功,虚竹练完顿觉神清气爽,而侍女们则有走火入魔之感。Why?功力尚浅。一本书初看,淡如开水,原因可能功力尚浅,当然还有一种原因,尽管我们不想承认,就是这本书实在是......太烂了。如果果真遇到一本好书,我们在看不懂的时候,不妨把它垫桌角,砸人等等干什么都行,就是不要再死读下去。过得半月,三月,半年或者一年,再读很有可能打通任督二脉,气贯丹田。
笨笨:“老师,讲课了。”
咳........咳.........(讲课,讲课,我是老师还是你是老师?)
好,首先我们看一看,如何在C#中声明委托
在C#中声明委托,就好像在C里声明函数指针一样,比如定义一个委托TwoLongsOp,该委托代表的函数有两个long型参数,返回类型为double,则写成如下形式:
delegate double TwoLongsOp(long first,long second);
紧接着我们就是在C#中使用委托
在C#中使用委托就好比 我们把函数指针指向相应的函数,然后调用该函数指针。讲这个我们将分为如下几种讲解,一 委托PK函数指针 内容:指向类的方法 二 委托PK函数指针 内容:作为函数参数 三 委托PK函数指针 内容:指向静态函数四 函数指针数组PK多播委托。
一 函数指针PK委托 内容:指向类的方法
(1)函数指针:
在第三节里,我们已经讲过,函数指针的声明和调用如下,具体参见第三节:
void (CA::*f1)();
f1 = CA::Fun;
CA a;
(a.*f1)();
(2)委托
delegate void FunDelegate();
CA a;
FunDelegate funMethod = new FunDelegate(a.Fun);
funMethod();
二 委托PK函数指针 内容:作为函数参数
(1)函数指针:
void CallFun(void (*f)())
{
f();
}
void (*f)();
f = CA::StaticFun; // StaticFun 是CA的静态函数
CallFun(f);
(2) 委托:
delegate void FunDelegate();
FunDelegate funMethod = new FunDelegate(CA.StaticFun);
CallFun(funMethod);                                        //实际上这并不符合C#语法,因为在C#里没有全局函数,这里是为了上下文比较。
三 委托PK函数指针 内容:指向静态函数
(1)函数指针:
void (*f)();
f = CA::StaticFun; // StaticFun 是CA的静态函数
f();
(2) 委托:
delegate void FunDelegate();
FunDelegate funMethod = new FunDelegate(CA.StaticFun);
funMethod();
四 函数指针数组PK多播委托
(1)函数指针数组:
typedef void (*PFV)();
PFV funarray[2];
funarray[0] = CA::StaticFun;
funarray[1] = CA::StaticFun;
funarray[0]();
funarray[1]();
(2)多播委托
delegate void FunDelegate();
FunDelegate funMethod1 = new FunDelegate(CA.StaticFun);
FunDelegate funMethod2 = new FunDelegate(CA.StaticFun);
FunDelegate funMethods = funMethod1 + funMethod2
其实通过上述的比较,无疑委托比函数指针实现的更为优雅,无论是数组,静态函数,类成员函数,作为函数参数和多播委托。委托都是用的同一种方式,容易掌握。而函数指针则没有这么简单地掌握。
而且委托是一种类型安全的操作。所谓“类型安全”和函数指针相比较可以体现在如下方面:
委托示例:
public delegate string GetAString();
GetAString firstStringMethod = new GetAString(null);
提示错误:“应输入方法名称”
创建一个委托的时候,不可能将一个空值作为构造函数的参数传给委托;
函数指针示例:
void (*f)();
f = NULL;             // f被赋成空值 或者不赋值 程序编译都会通过
f();
这段代码编译完全没有问题,但是程序运行的时候则会出问题。程序员有时候很容易将函数指针未赋值或者赋成空值。
嘘 这个问题总算讲完了。当我第一次看到委托的时候,其实我很震惊,因为没有想到能够用如此优雅的方式来实现。原来我以为C++中的纯虚函数机制,组件模型中的连接点机制就已经达到极致,但是委托则更为简明。真的是由于震撼才写出此文。仅以此文对微软和程序界的精英和前辈们表示敬意。

转载于:https://www.cnblogs.com/helloj2ee/archive/2008/12/02/1345865.html

木老师教笨笨课堂——系列讲座(从函数指针到委托) 四、C#的委托相关推荐

  1. 木老师教笨笨课堂——系列讲座(从函数指针到委托) 三、C++语言里的函数指针...

    先来回顾一下,我们说函数指针有一个重要的特性,它可以指向任何形参相同的函数.这样可以用统一的方式去调用不同的函数.(这个我还是希望笨笨同学好好思考一下,我想也是程序思想的精髓之一吧),就好比武功秘籍中 ...

  2. 木老师教笨笨课堂——系列讲座(从函数指针到委托) 二、C语言里的函数指针...

    二.C语言里的函数指针 上一节里介绍了回调函数,模块A提供了该函数 然后模块A调用B B再返过来调用A提供的函数,再处理最后返回结果给A.晕了.还是画个图.一般调用情况: 图2-1 有回调函数的调用情 ...

  3. C++入坑系列(五)之函数指针

    前言 简而言之,函数指针就是函数的地址.我们可以与数组进行类比,数组的数组名就是数组的首地址,而函数的地址就是函数名. 获取函数的地址 在实际使用中,我们可以直接通过访问函数名的方式便可以获得函数的地 ...

  4. 原创:纯手工打造CSS像素画--笨笨熊系列图标

    纯手工打造CSS像素画--笨笨熊系列图标 作者:冰极峰 转载请注明出处 在cssplay网站看到有一组CSS像素画,于是也想摩仿一下,于是在网络上找到一组头像图标,看其结构比较简单,就拿它开刀吧!先看 ...

  5. vmware nat模式网络不通_笨笨狗教你如何解决VMware虚拟机桥接网络不通问题?

    笨笨狗教你如何解决VMware虚拟机桥接网络不通问题? 背景介绍 在我们日常使用Kali Linux时,有时候我们将虚拟机网络连接方式设置为桥接后发现虚拟机Kali Linux无法ping通网络,或者 ...

  6. 精准营销 工业品网络营销系列讲座第一课 张进老师主讲

    精准营销 <工业品网络营销>系列讲座第一课 工业品网络营销是相对于传统的消费品营销而言,它具有更多的是精准性,这种精准性体现在哪几个方面呢? 第一点:企业的网站建设和维护要体现它的精准性, ...

  7. 仪征市实验小学教师计算机课,仪征市“智慧课堂系列研讨活动”在我校成功举办...

    原标题:仪征市"智慧课堂系列研讨活动"在我校成功举办 为更好地筹备扬州市信息化教学能手大赛,进一步提升教师教育信息化应用能力,探索如何利用信息技术构建智慧课堂信息化环境,实施智慧教 ...

  8. 清华大数据系列讲座——大数据发展与区块链应用成功举办

    2018年9月15日,由清华-青岛大数据工程研究中心主办的"清华大数据系列讲座-大数据发展与区块链应用"在中国海洋大学成功举办.本此讲座邀请到了清华-青岛数据科学研究院执行副院长韩 ...

  9. 德州学院计算机吴,计算机与信息学院举办“博士讲堂”系列讲座

    11月7日上午九点,在明理楼0225教室,计算机与信息学院刘豪睿博士为学生作了题为"工业领域的相关开发技术-以运动控制为例"的报告. 刘老师首先为同学们介绍了运动控制工业产品的软件 ...

最新文章

  1. 科普|什么是负载均衡(Load balancing)
  2. 业务脆弱性评估是业务持续性保障(BCM)的基础数据
  3. 安卓开发重磅炸弹!程序员福利!《高级Kotlin强化实战学习手册(附Demo)》开放下载!
  4. Eclipse快捷键指南
  5. SpringMVC自动配置||如何修改SpringBoot的默认配置
  6. koa --- jwt实现最简单的Token认证
  7. 在Spring Boot中实现相关ID(用于SOA /微服务中的分布式跟踪)
  8. 程序员创业的两难困境
  9. 08.QT中sqlite3数据库基本操作
  10. Python创建mat文件,打开mat文件
  11. 安徽省2018计算机一级9月报名,2018年9月份全国计算机等级考试安徽财经大学考点报名通知...
  12. 江西直播源PHP代理,直播源更新平台
  13. BUUCTF--相册
  14. Davinci BI报表工具~
  15. 大数据营销——构建数据价值分享模式
  16. linux中的ul命令,Linux ngrep 命令用法详解-Linux命令大全(手册)
  17. 手机计算机无法使用,用数据线把手机连接电脑,电脑无法识别,怎么回事?
  18. 服务器网卡支持25G,25G服务器网卡光模块解决方案
  19. go语言爬虫解析html,Python爬虫【如何爬取内容(html)和解析内容】-Go语言中文社区...
  20. 从零开始手写VIO 第二章 IMU传感器

热门文章

  1. python文件行数运行结果_python统计文件行数
  2. AppWidget实现机制分析--什么是桌面插件
  3. S3上备份的json文件转存成parquet文件
  4. 是时候该了解一波Protocol Buffers了[Java]
  5. Oracle开源Fn,加入Serverless之争
  6. 《机器人爱好者(第2辑)》——部署机械手或末端执行器
  7. Windows 环境下adb.exe无法启动的解决办法之一
  8. LVS_TUN 实验
  9. ╭☆难以割舍^_^就是牵挂☆╮
  10. Intel、AMD和Arm 告警:注意新的推断执行CPU漏洞!