博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

第8章 神奇的委托

 

【简述】:在.NET中,事件驱动、异步调用和Lambda都是建立于委托之上的。本章主要介绍委托的基础知识、泛型委托、Lambda及方法回调等。

 

第一节   委托的概念与使用

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

2、 实例:

        Public class MathOpt

        {

            Public int Add(int argument1,int argument2)

            {

               Return argument1 + argument2;

}

}

Public delegate int MathOptDelegate(int value1,int value2);  //定义一个委托类型

MathOptDelegate optDel;                                                //定义一个委托变量

MathOpt obj = new MathOpt();

oppDel = obj.Add;                                                        //接收一个对象实例方法

Console.WriteLine(oppDel(1,2));                                   //方法调用

3、  方法的签名:定义委托类型时对方法的要求被称为方法的签名(Signature),它规定了方法的参数数目和类型,以及方法的返回值。

4、 委托的基本用法:

A、 使用委托动态调用方法:

void DoCalculate(CalculateDelegate clmethod)    //输入参数是一个委托类型的变量。

B、使用委托实现多窗体通信:实现在不同的对象之间进行信息通信。

   其中书中一行错误:frm.recorder = this.ShowCount 改为 frm.recorder = this.Record

 

第二节   深入探索委托技术内幕

 1、  本质:委托本质上一个类,它继承自System.MulticastDelete类,该类维护一个带有链接的委托列表。

2、  调用多播委托时,将按照委托列表的委托列表的顺序而调用的。

3、  它继承的三个重要方法:BeginInvokeEndInvokeInvoke

4、委托一旦创建之后,它的委托调用列表是不可改的。

 

 

第三节  使用泛型委托

 1、  概念:泛型委托与普通委托类似,不同之处在于使用泛型委托时需要指定泛型参数。如

MyGenericDelegate<int> del = MyFunc;

2、  Func系统委托。依其泛型参数的多少有多个重载形式。Func系列委托用于引用一个有返回值的方法。

public delegate TResult Func<TResult>()

   public delegate TResult Func<T,TResult>(T arg)

   public delegate TResult Func<T1,T2,TResult>(T1 arg,T2 arg)

3、  Action系统委托。依其泛型参数的多少有多个重载形式。它用于返回void的方法。

public delegate void Action()

   Public delegate void Action<T>(T obj)

   Public delegate void Action<T1,T2>(T1 arg1,T2 arg2)

4、  Predicate<T>委托

A、 定义 public delegate bool Predicate<T>(T obj);

B、 它引用一个返回bool值的方法,在实际运用中,经常使用其变量引用一个“条件判断函数”。

C、 例子:List<T>中有一个Find方法。Public T Find(Predicate<T> match);

 

 

第四节 匿名方法与Lambda表达式

 1、 匿名方法:

A、 实例: public delegate int AddDelegate ( int i,int j);

           AddDelegate del = delegate(int i,int j)

           {

                       return i + j;

           };

Console.WriteLine(del(100,200));

B、 匿名方法其实是将方法定义与委托变量赋值两个步骤合在一起,从而省掉了单独定义一个方法的麻烦。

 2、 Lambda表达式:

A、 实例:SomeDelegateType del2 = arguments => { return arguments.ToString(); };

B、 Lambda表达式其实是就是匿名方法的进一步简化,可以用于定义一个匿名函数,并将其传给一个委托变量。

C、 用法:

      C1当只有一个输入参数时,括号是可选的,可表达式中只有一条return语句时,return 关键字也可省略。

          Func<int,bool> del1 = (x) => {return x > 0 ;}

          Func<int,bool> del1 = x = > x> 0;

      C.2  当有两个或更多的输入参数由逗号分隔。

           Func<int,int,bool> del2 = ( x,y) => x ==y;

 

第五节  掌握回调的编程技巧

      回调是一种非常有用的编程技术,本节介绍.NET应用程序中实现回调的4种典型方法。

1、 基于接口的回调实现方案:

2、 利用委托实现回调。

3、 定时回调。

利用Time类,可以定时回调一个满足TimerCallBack委托要求的方法。

Time类的构造函数 public Timer(TimerCallback callback,object state,int dueTime,int period)

其中:callback:要定时回调的方法。

      State: 向回调方法传送的参数。

      Duetime:调用回调方法之前延迟的时间量(以毫秒为单位)。

      Period:每隔多少毫秒调用一次回调方法。

4、多线程回调:

 

 

小结:委托本质上是一个类,它实现了面向对象的,类型安全的方法回调机制。