深入理解C#委托及原理
来源:互联网 发布:睿知而行 编辑:程序博客网 时间:2024/05/21 10:17
深入理解C#委托及原理
一、委托
设想,如果我们写了一个厨师做菜方法用来做菜,里面有
但,怎么为一个方法传
(一)、委托基础:
1.先看看代码:
(1).定一个方法:void
(2).声明一种委托类型:delegate
(3).创建委托类型对象:DGSayHi
(4).执行委托:
dgObj(“JamesZou”);
输出:Hi~JamesZou!
2.什么是委托?
(1)概念:“C#
(2)通俗:就是一个能存放很多方法的指针的调用清单(但方法签名必须和委托类型签名一样),你一调用这个清单,那么清单里的所有的指针所对应的方法就会依次被执行。
(3)比方说:有三台机器A、C、D,点一个红色按钮就会运行。操作人员接到指令,要求在接到电话后分别打开AD机器,然后然后工人就在接到电话后,先后打开AD机器。(此例中的
(4)概要图例:
DGSayHi
dgObj(“James”);
3.委托有什么用?
A.能够帮程序员在需要时,根据条件动态执行多个方法:(接上例代码)
(1)定三个方法:
void
void
string
(2)创建委托类型对象,并通过构造函数传参方式向委托对象“注册”第一个方法:
DGSayHi
(3)继续“注册两个方法”:
dgObj+=DaZhaoHu;//
//dgObj+=OhaUo;//注释此行代码,因为编译时报错,OhaUo方法签名与委托类型的签名不一致(委托签名无返回值)。
(4)执行委托对象:
dgObj(“James”);
输出:
Hi~James
你好啊~James
(5)概要图例
B.
(1).接上例代码,再定义一个方法:
void
(2).调用此方法:
DoTestDelegateFun(SayHi);//输出:Hi~钢铁侠(奇怪:竟然直接传方法了?后面解释)
(二)、委托原理
1.delegate
(1).概念:delegate
(2).编译后生成的的中间代码。
请大家思考一下,关键字是类型吗?不是。那编译器遇到这个关键字做了什么事情?借助【IL反汇编程序】
a.开始-程序-如图:
b.打开项目文件夹下的binDebug文件夹,找到程序集
找到我们定义了委托DGSayHi的类DelegateForFun,发现,里面的
编译前:delegate
变成了一个类:
单击展开后我们再来看看:
看出什么了?
(I).继承了System.MulticastDelegate。
(II).包含了构造方法、BeginInvoke、EndInvoke、Invoke方法。
也就是说此时,delegate代码已经编译成了如下代码:
编译后:
class
{
}
(3)System.MulticastDelegate
下面我们来看看借助.Net
public
由此我们可以看出继承关系:DGSayHi
MulticastDelegate类中有3个重要的成员,其中两个继承自
a.三者的作用:
_methodPtr
_target
_invocationList
b.概要图:
图中的委托对象
----------------------广州java培训、广州.Net培训、java培训----------------------
期待与您交流!
- 深入理解C#委托及原理
- 深入理解C#委托及原理
- 深入理解C#委托及原理
- 深入理解C#委托及原理
- ch01.深入理解C#委托及原理_《没有控件的ASPDONET》
- 深入对C#中委托的理解及应用
- 深入理解c#中的委托
- 深入理解C#中的委托
- 深入理解C#中的委托和事件
- 深入理解C#委托的实质
- 深入理解C#委托的实质
- 深入理解C#中的委托和事件
- 深入理解C#委托的实质
- C# 委托原理的探究与深入
- 深入理解C#中的委托和事件:委托的定义
- C#中的Predicate 理解 及 delegate 委托
- 对C#委托及事件委托的理解
- C#委托及事件委托的初步理解
- 爱,在项目管理的日子
- jquery.formValidator 验证案例 二
- Telnet协议详解及使用C# 用Socket 编程来实现Telnet协议【转】
- APUE学习--Ch.7 进程环境
- RFID与二维码有什么好争的
- 深入理解C#委托及原理
- 解释权限的继承性、累加性、优先性和交叉性
- 编程之美2.8 找符合条件的整数 求十进制表示只含1和0的正整数
- 使用 GDB 调试 Linux 软件
- flex 上传图片 例子
- 编程珠玑--节省空间
- C#生成验证码
- Android-Vold-初识
- wcstombs 使用之二,支持中文当unicode