首页 新闻 会员 周边 捐助

关于委托的使用

0
悬赏园豆:10 [已解决问题] 解决于 2017-09-18 15:29

使用委托时如果参数(方法)是不确定的,该如何判断?

一直以来都有一个疑问,网上多数关于委托的文章都是借鉴张子阳前辈的例子。

比如语言问候的例子时,

 中文问候:  传入中文姓名,中文方法。两个参数

 英文问候:  传入英文姓名,英文方法。两个参数

。。。。

此时客户端传来一个name,不确定是中文英文还是法文,使用委托,又是怎么判断具体要调用哪一种方法呢?难道写一个if判断?

委托到底能不能替代所谓的Switch/If?

郎中令的主页 郎中令 | 菜鸟二级 | 园豆:244
提问于:2017-09-18 11:25
< >
分享
最佳答案
0

这个语言问候的例子很扯淡,根本就没法表达委托的真正含义。

委托也好,事件也好,本质都是对编程语言中的子程序抽象的包装加工衍生出来的高级抽象的语言特性。

众所周知,编程语言里面我们可以给函数传递参数,这个参数大多数情况下是数据,这叫作数据抽象;当你把一段处理逻辑写成了一个函数,想把这个函数本身作为一个参数的时候,就是子程序抽象。在C,C++中的做法就是传递一个函数的指针,但是指针本身包含的信息很少,无法从指针无法得知其背后的函数有那些参数,参数怎么排列的,返回值是什么等等,这就造成写代码的时候会有很大的程度会写错,编译器也难以检查这类错误。C#的委托,则是对这个函数指针的一个包装,弥补了上面说的那些信息,使得语言的类型安全得到了保障,可以认为是一个类型安全的函数指针。

事件则是利用了委托背后代表的是一个子程序这一点来实现的广播模式。

收获园豆:3
Timetombs | 老鸟四级 |园豆:3959 | 2017-09-18 12:51

之前写过一篇分析委托内部实现的文章:http://www.cnblogs.com/linianhui/archive/2011/04/01/csharp1_delegate.html

Timetombs | 园豆:3959 (老鸟四级) | 2017-09-18 13:09

@Blackheart: 谢谢你详细耐心的解答,id已关注,定好好拜读文章

郎中令 | 园豆:244 (菜鸟二级) | 2017-09-18 15:25
其他回答(3)
0

委托和消除分支条件没什么关系。

要消除分支条件从if else到通过对象派生继承关系来解决。

收获园豆:2
Daniel Cai | 园豆:10424 (专家六级) | 2017-09-18 11:34

好的,谢谢,因为我看这些文章开头都是以各种消除if、swich和增加扩展性来做说明的,比较疑惑

支持(0) 反对(0) 郎中令 | 园豆:244 (菜鸟二级) | 2017-09-18 12:07
0

委托和消除分支条件没什么关系。

收获园豆:2
数据酷软件 | 园豆:130 (初学一级) | 2017-09-18 13:17

谢谢你的回答,我用的时候也是这样想的,但是学校的教材和网上多数的例子都是拿消除分支来说的

支持(0) 反对(0) 郎中令 | 园豆:244 (菜鸟二级) | 2017-09-18 15:27
0

你这个语言问候的例子确实容易让初学者产生误解

正如前面几个的回答,委托不能消除分支,也无法替换掉Switch/If

下面说一下委托比较常用到的两个场景:

1、委托最常用的地方是事件,做过窗体程序的都用过事件。事件可以说是委托的封装。

2、委托还能进行跨线程访问,窗体程序中控件都是在主进程(ui进程)中生成的,而后台进程是无法修改控件的,如果一定要在后台进行修改控件,就可以通过委托来修改。

收获园豆:3
海之殇 | 园豆:500 (菜鸟二级) | 2017-09-18 13:32

谢谢你的回答,我用的时候也是这样想的,但是学校的教材和网上多数的例子都是拿消除分支来说的,一直以来都比较迷惑,今天项目用的时候发现确实有点问题。看来学习确实还是要深入。再次谢谢你的回答

支持(0) 反对(0) 郎中令 | 园豆:244 (菜鸟二级) | 2017-09-18 15:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册