您的位置:首页 > 编程语言

《.NET4.0 面向对象编程漫谈》读书笔记 ——第8章 神奇的委托

2011-05-13 12:24 495 查看
第8章 神奇的委托[/b]

[/b]

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

第一节 [/b]委托的概念与使用[/b]

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

2、 [/b]实例:[/b]

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、 方法的签名:[/b]定义委托类型时对方法的要求被称为方法的签名(Signature),它规定了方法的参数数目和类型,以及方法的返回值。

4、 [/b]委托的基本用法:[/b]

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

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

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

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

第二节 [/b]深入探索委托技术内幕[/b]

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

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

3、 它继承的三个重要方法:BeginInvoke、EndInvoke、Invoke。

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

第三节 [/b]使用泛型委托[/b]

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

MyGenericDelegate<int> del = MyFunc;

2、 Func[/b]系统委托[/b]。依其泛型参数的多少有多个重载形式。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[/b]系统委托[/b]。依其泛型参数的多少有多个重载形式。它用于返回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>[/b]委托[/b]。

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

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

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

第四节 [/b]匿名方法与Lambda[/b]表达式[/b]

1、 [/b]匿名方法:[/b]

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、 [/b]Lambda[/b]表达式:[/b]

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;

第五节 [/b]掌握回调的编程技巧[/b]

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

1、 [/b]基于接口的回调实现方案:[/b]

2、 [/b]利用委托实现回调。[/b]

3、 [/b]定时回调。[/b]

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

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

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

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

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

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

4[/b]、多线程回调:[/b]

小结:委托本质上是一个类,它实现了面向对象的,类型安全的方法回调机制。[/b][/b]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: