《.NET4.0 面向对象编程漫谈》读书笔记 ——第8章 神奇的委托
第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、 它继承的三个重要方法:BeginInvoke、EndInvoke、Invoke。
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、 用法:
C.1当只有一个输入参数时,括号是可选的,可表达式中只有一条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、多线程回调:
小结:委托本质上是一个类,它实现了面向对象的,类型安全的方法回调机制。
补充:Web开发 , ASP.Net ,