第八章 委托,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表达式不 :

仅仅用于委托

第八章 委托,lamdbda 表达式和事件的更多相关文章

  1. C#编程 委托 Lambda表达式和事件

    委托 如果我们要把方法当做参数来传递的话,就要用到委托.简单来说委托是一个类型,这个类型可以赋值一个方法的引用. 声明委托 在C#中使用一个类分两个阶段,首选定义这个类,告诉编译器这个类由什么字段和方 ...

  2. C#学习笔记三(委托·lambda表达式和事件,字符串和正则表达式,集合,特殊的集合)

    委托和事件的区别 序号 区别 委托 事件 1 是否可以使用=来赋值 是 否 2 是否可以在类外部进行调用 是 否 3 是否是一个类型 是 否,事件修饰的是一个对象 public delegate vo ...

  3. 第8章 委托、Lamdba表达式和事件

    本章内容: 委托    Lambda表达式 事件 8.1.3   简单的委托示例 首先定义一个类MathOperations,它有两个静态方法,对double类型的值执行两个操作. public cl ...

  4. C# 委托、lambda表达式和事件

    什么是委托?委托就是持有一个或多个方法的对象,并且该对象可以执行,可以传递. using System; using System.Collections.Generic; using System. ...

  5. 委托、Lambda表达式、事件系列07,使用EventHandler委托

    谈到事件注册,EventHandler是最常用的. EventHandler是一个委托,接收2个形参.sender是指事件的发起者,e代表事件参数. □ 使用EventHandler实现猜拳游戏 使用 ...

  6. 委托、Lambda表达式、事件系列06,使用Action实现观察者模式,体验委托和事件的区别

    在"实现观察者模式(Observer Pattern)的2种方式"中,曾经通过接口的方式.委托与事件的方式实现过观察者模式.本篇体验使用Action实现此模式,并从中体验委托与事件 ...

  7. 委托、Lambda表达式、事件系列05,Action委托与闭包

    来看使用Action委托的一个实例: static void Main(string[] args) { int i = 0; Action a = () => i++; a(); a(); C ...

  8. 委托、Lambda表达式、事件系列04,委托链是怎样形成的, 多播委托, 调用委托链方法,委托链异常处理

    委托是多播委托,我们可以通过"+="把多个方法赋给委托变量,这样就形成了一个委托链.本篇的话题包括:委托链是怎样形成的,如何调用委托链方法,以及委托链异常处理. □ 调用返回类型为 ...

  9. 委托、Lambda表达式、事件系列03,从委托到Lamda表达式

    在"委托.Lambda表达式.事件系列02,什么时候该用委托"一文中,使用委托让代码简洁了不少. namespace ConsoleApplication2 { internal ...

随机推荐

  1. Python的并发并行[1] -> 线程[2] -> 锁与信号量

    锁与信号量 目录 添加线程锁 锁的本质 互斥锁与可重入锁 死锁的产生 锁的上下文管理 信号量与有界信号量 1 添加线程锁 由于多线程对资源的抢占顺序不同,可能会产生冲突,通过添加线程锁来对共有资源进行 ...

  2. 腾讯消消乐 (状态压缩DP)

    腾讯消消乐 题意 给出长度为 n 的序列,每次可以选择删除序列的一个连续区间,要求这一段区间内所有数最大公约数不小于 k ,删除后剩下的序列仍然构成连续序列. 定义 f(i) 为进行 i 次操作将整个 ...

  3. 多层代理获取用户真实IP

    1. 几个概念remote_addr:如果中间没有代理,这个就是客户端的真实IP,如果有代理,这就是上层代理的IP.X-Forwarded-For:一个HTTP扩展头,格式为 X-Forwarded- ...

  4. String format -1 常规格式化

    常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的读者应该记得C语言的sprintf()方法,两者有类似之处.format()方法有两种重 ...

  5. 洛谷 P4212 外太空旅行

    题目描述 在人类的触角伸向银河系的边缘之际,普通人上太空旅行已经变得稀松平常了.某理科试验班有n个人,现在班主任要从中选出尽量多的人去参加一次太空旅行活动. 可是n名同学并不是和平相处的.有的人,比如 ...

  6. GoodSync

    文件管理这件看 似简单的事,真的不简单,因为为了防止意外情况,你需要对文件进行备份,时间一久随着文件数量的增加,再加上有时也会临时队备份文件进行修改等.再想查出 这个是最新的.文件有木有全部备份等…. ...

  7. 设计模式之享元模式(PHP实现)

    github地址:https://github.com/ZQCard/design_pattern /** * 减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式, * 它 ...

  8. [转载] K3 K3c 最简单无损开壳方法

    只用一把螺丝刀就行了,其它什么撬棒  信用卡  撬片等 拆机工具一概不用.拆了5台,只有一台断了一个扣口. 1. 把底部4个螺丝拿掉.2.把路由如图放在桌子上,路由平行于身体,注意是立着放 使路由与桌 ...

  9. log4j教程 10、PatternLayout

    如果想生成基于模式的特定格式的日志信息,那么可以使用 org.apache.log4j.PatternLayout 格式化日志信息. PatternLayout类扩展抽象 org.apache.log ...

  10. go语言编程小tips

    go语言一个比较方便的特性是你不需要显示的定义一个变量.例如,在c语言中,你想要使用一个int型变量,那么代码如下 int i; i =0; i++; 而在go语言中, i := 0; i++ 这样你 ...