委派和事件的知识点
事件和委派通常用于应用程序需要被通知以执行特殊操作的情况。
一、委派(委托)
1、委派概念
在C#中,大体包含两种对象:一类产生变化;另一类响应变化。一个委派作为两个对象之间的通道,从一方向另一方传递信息。
委派声明格式:
访问修饰符 delegate关键字 委派调用方法的返回值类型 委派名称(委派调用方法所接受的参数)
AccessModifier delegate type DelegateName(parameter)
委派不是一个方法或任何类型的函数。实际上,它和函数指针的定义很相似。不能直接使用一个委派,而需要将一个函数和它相关联。
委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值
委托是一种安全地封装方法的类型,它与 C 和 C++ 中的函数指针类似。与 C 中的函数指针不同,委托是面向对象的、类型安全的和保险的。委托的类型由委托的名称定义。
声明所创建的委派类型,其返回值type及参数表parameter与往后所用的方法,必须完全相符!
2、委派调用函数一般分为三个步骤
1)创建一个委派
2)为创建的委派实例化一个资源对象
3)创建委派处理器,即关联委派调用的方法
3、初步学习,发现还是《叩响C#之门》中关于这部分内容的讲解更好一些,感谢寒飞雨!
http://www.cnblogs.com/BeginnerClassroom/archive/2009/09/23/1572522.html
其实委托就可以看做是函数的别名,但它是对象,是将被委托方法进行了封装,提高了安全性,可作为参数放于其他方法的参数列表中。
(MSDN内容:(要再回顾,存留疑问!)
构造委托对象时,通常提供委托将包装的方法的名称或使用匿名方法。实例化委托后,委托将把对它进行的方法调用传递给方法。调用方传递给委托的参数被传递给方法,来自方法的返回值(如果有)由委托返回给调用方。这被称为调用委托。可以将一个实例化的委托视为被包装的方法本身来调用该委托。
委托类型派生自 .NET Framework 中的 Delegate 类。委托类型是密封的,不能从 Delegate 中派生委托类型,也不可能从中派生自定义类。由于实例化委托是一个对象,所以可以将其作为参数进行传递,也可以将其赋值给属性。这样,方法便可以将一个委托作为参数来接受,并且以后可以调用该委托。这称为异步回调,是在较长的进程完成后用来通知调用方的常用方法。以这种方式使用委托时,使用委托的代码无需了解有关所用方法的实现方面的任何信息。此功能类似于接口所提供的封装。
)
4、多重传送委派
上述的是一个委派一次只引用一个方法,次委派称为单一传送委派。如果一个委派一次同时引用两个以上的方法,称此委派为多重(Multicasting)委派。
使用多重传送委派,需要用“+=”运算符来将多重方法同时附加至指定的委派处理器中。一旦委派被调用,委派处理器中的方法将依次被调用。单一的委派只使用“=”运算符来指定委派处理器的方法。
声明多重委派的时候,其返回值必须为void,否则,不能产生多重传送的委派类型。
(MSDN内容:
知识扩充:何时使用委托而不使用接口
委托和接口都允许类设计器分离类型声明和实现。给定的接口可由任何类或结构继承和实现;可以为任何类中的方法创建委托,前提是该方法符合委托的方法签名。接口引用或委托可由不了解实现该接口或委托方法的类的对象使用。既然存在这些相似性,那么类设计器何时应使用委托,何时又该使用接口呢?
在以下情况中使用委托:
当使用事件设计模式时。
当封装静态方法可取时。
当调用方不需要访问实现该方法的对象中的其他属性、方法或接口时。
需要方便的组合。
当类可能需要该方法的多个实现时。
在以下情况中使用接口:
当存在一组可能被调用的相关方法时。
当类只需要方法的单个实现时。
当使用接口的类想要将该接口强制转换为其他接口或类类型时。
当正在实现的方法链接到类的类型或标识时:例如比较方法。
)
二、事件
1、编写事件处理器步骤
事件是一种直观的概念,它提供一种机制,为某个特定的事件产生相应的响应。在C#中,整个机制都是基于委派的,委派在事件和时间处理器之间充当管道的作用。委派将关于事件的信息传递给事件处理器,并允许从事件处理器中取回信息。编写事件处理程序一般需要如下几个步骤:
1)声明委派类
2)定义System.EventArgs类的派生类,存储事件的相关信息。
3)在触发事件的类中使用关键字声明事件
4)定义事件处理的方法
5)使用委派封装方法成员
6)引用委派方法处理触发的事件
事件本身就如同方法或字段等,为存在于类内部的一个特定的成员,由指定的委派类型所支持,声明事件的语法如下:
访问修饰符 event关键字 支持此事件的委派类 事件名
AccessModifier event DelegateName EventName
为了实现事件的支持,我们可以自己定义任何事件的方法,但是,在定义这些方法时,最好符合.NET本身处理事件方法所提出的标准。
在.NET中,事件处理的方法一般有两个参数:一个是object类型,代表触发此事件的来源对象;一个是EventArgs类型参数e,这个参数包含了与事件相关的一些信息。在.NET中,定义事件处理方法的标准必须包含这两种参数,以符合.NET对组件设计的规范。
组件是一种可以重复利用,并且能够独立存在,具有完整功能的程序。
2、内置的委派类型
.NET类库提供了一个默认的委派类EventHandle,在一般情况下,可以使用EventHandler这个默认的委派类型,支持自定义的事件,而不需要顶一个新的委派,需要注意的是
EventHandler委派所应用的方法必须接受Object和EventArgs这两种类型的自变量。
3、多重传送事件
委派允许多重传送,由于事件是在委派的基础上创建的,所以,事件同样也支持多重传送机制,多重传送允许用户一次编写让多个对象同时相应相同事件的代码。在代码中,与多重传送委派类似,多重传送事件也使用“+=”运算符,引用不同方法的委派对象加入事件中。
4、如果事件方法参数不是.NET标准,而是自定义的类型,一定要保证委派的参数和事件方法参数必须相同。