第八章 委托,lamdbda 表达式和事件
第八章 委托,lamdbda 表达式和事件
委托是寻址方式的.net版本。
委托是类型安全的类,它定义了返回类型和参数的类型。委托类不仅包含方法的应用,也可以包含对多个方法的引用。
在 C++中,函数指针只不过是一个指向内存位置的指针,它不是类型安全的。我们无法判断这个指针实际指向什么,像参数和返回类型等项就更无从知晓了
Lamdbda表达式与委托直接相关。当参数是委托类型时,就可以使用Lambda表达式实现委托引用的方法。
委托时是一种特殊的类型对象,其特殊之处在于,我们以前定义的所有对象都包含数据,而委托包含的只是一个或者多个方法的地址
所以可以在定义类的任何相同地方定义委托,也就是说,可以在另一个类的内部定义,也可以在任何类的外部定义,还可以在名称空间中把委托定义为顶层对象
声明委托
定义这种类型的委托返回那种类型的方法
必须创建该委托的一个实例
理解委托最好的方式是吧委托当成一件事情,它给方法的签名和返回类型制定名称
因为定义委托基本上是定义一个新类,所以可以在定义类的任何相同地方定义委托,也就是说,可以在另一个类的内
也可以在任何类的外部定义,还可以在名称空间中把委托定义为顶层对象
实际上(定义一个委托是指)“定义一个新类”委托实现为派生自基类的类
使用委托
在c#中委托在语法上总是接受一个参数的构造函数,这个参数就是委托应用的方法。这个方法必须匹配最初定义委托时的签名。
只能把方法的地址赋值给委托变量不能把方法赋值给委托变量
GetAString firstStringMethod = new GetAString(x.ToString);
不能写成
GetAString firstStringMethod = new GetAString(x.ToString());
委托推断可以在需要委托实例的任何地方使用委托推断也可以用于事件,因为事件基于委托
给定委托的实例可以引用任何类型的任何对象上的实例方法或静态方法——只要方法
委托的一种使用方式:把方法组合到一个数组中来使用,这样就可以在循环中调用不同的方法了。
Action<T>和Func<T>委托
泛型Aciton<T>委托表示引用一个void返回类型的方法
Func<T>委托表示引用一个有返回值类型的方法
最多可以传递16个参数和一个返回值类型
包含多个方法的委托称为多播委托
多播委托识别“-”和“-=”,“+”和“+=”运算符。
使用匿名方法时必须注意:在匿名方法中不能使用跳转语句(break,goto,contunue)
调到该方法外部,反之亦然
在匿名方法内部不能访问不安全的代码
Lambda表达式
只要有委托参数类型的地方,就可以使用lamdba表达式
Lambda运算符“=>”的左边列出了需要的参数。Lambda运算符的右边定义了赋予lambda变
量的方法的实现代码。
事件
事件基于委托,为委托提供了一种发布/订阅机制。在架构中到处都能看到事件。
事件一般包括两个带参数的方法:
l 第一个参数是一个对象,包含事件的发送者
l 第二个参数提供了事件相关的信息。
对于事件,使用 add和 re1noVe关键字添加和删除委托的
处理程序
注意与多播委托一样,方 法的调用顺序无法保证。为了更多地控制处理程序的调用,
可以使用 Dclcgate类 的 GetInvocationList()方 法,访 问委托列表中的每一项,并 独立地调用每个方法。
第一个参数必须是Object类型,第二个参数是T类型。EventHandler<eventArg>少还定义了一个关于T的约束:它
必须派生自基类EventArgs,CarWoEventArgs就派生自基类EventArgs:
弱事件管理器
要使用弱事件,需要创建一个派生自WeekEvenManager类的类。WeekEventMmger类在程序集Wmdows.Base的名称空间system.Wmdows中定义,监听器需要继承IWeakEventListener
对于弱事件模式,弱事件管理器类需要静态方法Addlistener()和StopListner侦听器使用这些方法连接发布程序,和断开与发布程序的连接,而不是直接使用发布程序中的事件.
侦听器还需要实现稍后介绍的接口IWeekEventListener.通过Addlistener()和
RemoveListner()方法,调用WeekEvenManager基类中的方法,来添加和删除侦听器。
如果弱事件管理器类需要连接到不同的发布程序类型上,就可以在源对象中检查类
型信息,之后进行类型强制转换。接着使用基类的DeliverEvent()方法,把事件传递给侦听器。
DeliverEvent()方法在侦听器中调用IWeekEventListener接口中的ReceiveWeekEvent()方法:
侦听器需要改为实现IweekEventLister接口。这个接口定义了ReceiveWeekEvent()方法,触发
事件时,从弱事件管理器中调用这个方法
事件是.net开发人员监控应用程序执行时出现的各windows消息的方式,
在设计大型应用程序时,使用委托和事件可以减少依赖性和层的耦合,并能开发出具有更高重 ˉ
用性的组件。
Lambda表达式是委托的C#语言特性。通过它们可以减少需要编写的代码量。Lambda表达式不 :
仅仅用于委托