目录
从数据结构来讲,委托是和类一样是一种用户自定义类型;从设计模式来讲,委托(类)提供了方法(对象)的抽象。它存储的就是一系列具有相同签名和返回回类型的方法的地址。调用委托的时候,委托包含的所有方法将被执行。
声明:
delegate void MyDelegate(int a);
这个委托可以指向带有一个int类型的参数,并且返回值是void的方法。
MyDelegate myDel;
初始化:
delegate int MyDelegate(int a);
MyDelegate myDel=GetNumber;
第一种:int res1 = myDel(10);//通过委托实例去调用myDel所引用的方法
第二种:int res2 = myDel.Invoke(10);//通过invoke方法调用myDel所引用的方法
两种方式调用方法都一样

Func引用了一个带有一个返回值的方法,它可以传递0或者多到16个参数类型,和一个返回类型
Func
Func
Func
(1)对int类型数组进行排序


(2)通用的排序方法



添加移除委托的引用
前面使用的委托都只包含一个方法的调用,但是委托也可以包含多个方法,这种委托叫做多播委托。使用多播委托就可以按照顺序调用多个方法,多播委托只能得到调用的最后一个方法的结果,一般我们把多播委托的返回类型声明为void。
到目前为止,使用委托,都是先定义一个方法,然后把方法给委托的实例。但还有另外一种使用委托的方式,不用去定义一个方法,应该说是使用匿名方法(方法没有名字)。

在这里相当于直接把要引用的方法直接写在了后面,优点是减少了要编写的代码,减少代码的复杂性。匿名方法 本质上是一个方法,只是没有名字,任何使用委托变量的地方都可以使用匿名方法赋值。
从C#3.0开始,可以使用Lambda表达式代替匿名方法。只要有委托参数类型的地方就可以使用Lambda表达式。Lambda运算符“=>”的左边列出了需要的参数,如果是一个参数可以直接写 a=>(参数名自己定义),如果多个参数就使用括号括起来,参数之间以,间隔,无参数的的话不能省略()。

(1)如果Lambda表达式只有一条语句,在方法快内就不需要花括号和return语句,编译器会自动添加return语句,
Func
square = x=>x*x; 添加花括号,return语句和分号是完全合法的
Func
square = x=> {
return x*x;
}
(2)如果Lambda表达式的实现代码中需要多条语句,就必须添加花括号和return语句。
事件(event)基于委托,为委托提供了一个发布/订阅机制,我们可以说事件是一种具有特殊签名的委托。事件(event)是类或对象向其他类或对象通知发生的事情的一种特殊签名的委托。
事件的声明
public event 委托类型 事件名;
事件使用event关键词来声明,他的返回类值是一个委托类型。
通常事件的命名,以名字+Event 作为他的名称,在编码中尽量使用规范命名,增加代码可读性。
一群老鼠在房间里面偷东西,猫进房间喵喵叫,老鼠逃跑,主人被吵醒。

该事件的实现



