委托:
1.可以认为委托是持有一个或多个方法的对象。
2.委托和类一样,是用户自定义的一种类型。
Delegate void mydel(int value);
3.可以通过以下步骤来使用委托:
1).声明一个委托类型。委托声明看上去和方法声明相似,只是没有实现块。
2).使用该委托类型的一个声明变量。
3).创建委托类型的对象,把它赋值给委托变量。新的委托对象包括指向某个方法的引用,这个方法和第一步定义的签名和返回类型一致。
4).你可以选择为委托对象增加其他方法。这些方法必须与第一步中定义的委托类型有相同的签名和返回类型。
5).在代码中你可以像调用方法一样调用委托。在调用委托的时候,其包含的每一个方法都会执行。
6).委托添加可用+,删除可用-.
4.匿名方法:
如果方法只被使用一次,在这种情况下,除了创建委托的语法需要,没有必要创建独立的具名方法。匿名方法允许我们避免使用独立的具名方法。
Example 1:(非匿名)
class Program{
public static int add(int x){
return x+20;}
delegate int mydel(int value);
static void main(){
mydel my=add;
my(5);
}}
Example 2.(匿名)
class Program{
delegate int mydel(int value);
static vod main(){
mydel my=delegate(int value){
return x+20;}
my(5);
}}
我们可以在如下地方使用匿名方法:
- 声明委托变量时作为初始化表达式。
- 组合委托时赋值语句在右边。
- 为委托增加事件时在赋值语句右边。
匿名方法的语法:
关键字 参数列表 语句块
delegate(Parametes){ImplementationCode}
5.Lambda表达式
在C#2.0引入delegate,在c#3.0时引入Lambda表达式简化匿名方法,如果Lambda先出则无需匿名方法。
Mydel del=delegate(int x){return x+20;}
Mydel de = (int x)=>{return x+20;}
编译器可以从委托声明知道委托参数的类型,故Lambda表达式允许我们省略关键字如Lea2。带有类型的参数列表称为显式参数,省略类型的参数列表称为隐式参数.
如果只有一个隐式参数则可以省略括号如Lea3。
如果表达式中只有一个语句,省略大括号入Lea4.
Mydel del=delegate(int x) {return x+1;}
Mydel lea1= (int x) =>{return x+1;}
Mydel lea2= (x) =>{return x+1;}
Mydel lea3= x =>{return x+1;}
Mydel lea4= x =>return +1;
事件
发布者/订阅者模式:发布者发布消息,所有订阅者能够获取通知。
1.声明事件
class Incrementer{
关键字 事件名字
public event EventHandler CountedAdozen}
委托类型
事件是成员:一个常见的误解是把事件认为是类型,然而它和方法、属性一样,事件是类或结构的成员。
2.订阅事件
使用+=添加,添加成员可以是如下实例方法、静态方法、匿名方法和Lambda表达式。
3.触发事件
首先判断事件是否为空,如不类似函数执行
4.标准事件的用法
对于事件的使用,.net框架提供了一个标准模式。事件使用的标准模式的根本就是System命名空间声明的EventHandler委托类型。关于该类型声明以下几点:
- 第一个参数用来保存触发事件的对象引用。由于是Object类型,所以可以匹配任何类。
- 第二个参数用来保存状态信息,指明什么类型适用于该应用程序。
- 返回类型是void。
EventHandler委托类型的第二个参数是EventArgs类的对象,它声明在System命名空间中。EventArgs设计为不能传递任何数据。它用于不需要传递数据的事件处理程序——通常会被忽略。如果你希望传递数据,必须声明一个派生自EventArgs,使用合适的字段保存需要的数据。
尽管EventArgs类实际上并不传递数据,但它是使用EventHandler委托模式的重要部分。不管参数使用的实际类型是什么,object和EventArgs总是基类。这样EventHandler就能对所有事件和事件处理器都通用的签名,只允许俩个参数,而不是各自都拥有签名。
通过拓展EventArgs来传递参数,使用泛型类EventHandler<拓展的EventArgs>;随后的事件订阅者中的委托事件Test(object o,拓展的类型 t);
使用-=移除事件。
5.事件访问器
有俩个访问器:add和remove
public event EventHandler c{
add{}
remove{}
}