委托

1、委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值
2、委托的条件:与委托的签名(由返回类型和参数组成)匹配的任何方法都可以分配给该委托。
3、简单理解Delegate委托(或代理)是一种数据类型:它的变量可以引用到某一个符合要求的方法上,通过委托可以间接地调用该方法
4、可以这么理解:委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

 委托揭秘:

//A 定义一个委托:
public delegate void Feedback(string message);
//B 实例化委托
Feedback tdm1 = new Feedback(showMes); //showMes是方法
//C 直接调用委托
tdm1("hello,这是委托调用方式一");
 
1 在A中事实上编译器会定义一个完整的类: Feedback
如上图:所有委托都有一个构造器默认获取两个参数,一个是对象引用@object,一个是引用了回调方法的整数method;在构造器内部这两个参数被保存在_target和_methodPtr私有字段中,这两个字段来自委托的父类MulticastDelegate,另外构造器还将_invocationList设置为null,在此后委托链会使用它。
Invoke,编译器实在定义委托类的时候定义Invoke的,在Invoke被调用时(默认使用委托时,其实是调用了该委托的Invoke方法),它使用私有字段_target和_methodPtr在指定对象上调用包装好的回调方法,Invoke方法的签名和委托的签名匹配

委托基类介绍

新定义的委托继承自MulticastDelegate类,MulticastDelegate继承自sysrem.Delegate类,sysrem.Delegate类又继承自Object类,所以你定义的委托都包含MulticastDelegate的行为;由于委托是类,所以凡是能够定义类的地方都可以定义委托;

委托链

前面使用的每个委托都只包含一个方法调用。调用一个委托就调用一个方法调用。如果要通过一个委托调用多个方法,那就需要使用委托的多播特性。委托链。如果调用多播委托,就可以按委托添加次序连续调用多个方法。为此,委托的签名就必须返回void;否则,就只能得到委托调用的最后一个方法的结果;
语法糖的操作符:+= 将方法绑定到委托 -= 解绑
/// <summary>
/// 定义包含一个参数的委托
/// </summary>
/// <param name="name"></param>
public delegate void GreetingDelegate(string name);
public GreetingDelegate delegate1; //委托的实例,变量
//绑定方法
delegate1 += Chinese;
delegate1 += English;
此处delegate1是当前类的一个变量,在oop中我们在外部对字段进行赋值显然破坏了类的封闭性,在非委托类型中我们一般使用 属性解决这种问题,但是委托是没有属性生命语法的,委托的属性表现形式就是事件 event
 

委托事件(事件)的声明

//声明委托
public delegate void GreetingDelegate(tring name));
public event GreetingDelegate Delegate1Event; //声明委托事件 (委托的属性表现形式)
//绑定方法
Delegate1Event+= Chinese;
Delegate1Event+= English;
 
事实上webform中我们看到的事件不是长这样的,例如click事件有两个参数,那是因为上面定义的事件不符合.Net Framework的编码规范。但是这不是必须的事件规范;
符合 .Net Framework的编码规范的委托事件:
1)委托的原型定义:有一个void返回值,并接受两个输入参数:一个Object 类型(委托方法所属的对象),一个 EventArgs类型(或继承自EventArgs)
2)委托类型的名称都应该以EventHandler结束, 事件的命名为 委托去掉 EventHandler之后剩余的部分。 委托参数的定义:继承自EventArgs的类型应该以EventArgs结尾。
 
 
绑定方法:
 
 
参考:http://baike.baidu.com/link?url=sMxb7674tpe-31u4QC79apk9eGrO31Kq26GddetLFYeSG9jM35cXAjB0k8KNM9fXLx6q_OkHpygeSOA_KuPLOWr6-h48-nin1ehwaqV_v43
 
 
 
posted @ 2017-01-18 11:15  二月长安  阅读(129)  评论(0编辑  收藏  举报