基础【委托】------(委托)-------(整理)

1,委托概述

常用数据类型(如int)的使用方法:先定义一个变量,然后再给它赋值,如下:

int i;//定义变量

i=100;//给变量赋值

类似地,委托也可以看成是一种数据类型,可以用于定义变量。但它所定义的变量能接收的值只能是一个方法

例:

     定义一个类MathOpt,定义一个方法Add:

     public class MathOpt

     {

         public int Add(int argument1,int argument2)

         {

          return argument1+argument2;

         }

       }

        定义一个委托数据类型MathOptDelegate:

        public delegate int MathOptDelegate(int value1,int value2);

        与定义的Add方法想比较,两者都接受两个int 类型的参数,返回一个int类型的数值。

        定义好了委托数据类型之后,在Main方法中即可定义一个此委托类型的变量:

        MathOptDelegate oppDel;

        接着可以给此变量赋值:

        MathOpt obj = new MathOpt();

        oppDel = obj.Add;

       注意:委托变量可接收一个对象实例方法的引用。

       使用委托变量:赋值之后的委托变量可以当成普通方法一样使用:

       Console.WriteLine(oppDel(1,2));//输出:3

      上句等同于:Console.WriteLine(obj.Add(1,2));//输出:3

      委托可以看成是一个方法的“容器”,将某一具体的方法“载入”后,就可以把它当成方法一样使用。但是,  只有当方法的“签名”和委托一致,才能将方法赋值给委托变量(静态方法,实例方法都可以)。方法的签名规定了方法的参数数目和类型,以及方法的返回值,体现了方法的本质特质。每一个委托都确定了一个方法的签名。大多数情况下,拥有不同签名的方法不能赋值给同一个委托变量。

注:委托的“协变”和“逆变”特性可以有限度地突破这一限制。

2,详解委托

     (1)委托实际执行过程:建立委托实际是建立一个新的类。执行过程大致可能为:CLR将对委托变量的调用转换为查询相应类型的方法表,找到符合要求的方法并调用之,而这一切都是在运行时完成的。

    (2)委托调用列表:委托是调用方法的另一种方式,但是比直接调用方法更好的是,委托变量可以组合多个方法并批量执行他们。

    可以用加法运算符来组合单个委托变量为多路委托变量,类似地,可以使用减法运算符来从一个多路委托变量中移除某个委托变量。

委托变量的组合与分解特性:委托变量内部可以包含多个方法引用,这些方法引用被称为“委托调用列表”,委托变量的组合和分解,本质上就是它们内部所包含的委托方法列表的“组合”与“切割”。

QQ截图20131128105851

posted @ 2013-11-28 10:23  行进  阅读(198)  评论(0编辑  收藏  举报