目录
一、委托
1.什么是委托
2.委托类型的声明与初始化
3.委托类型引用方法的调用
4.使用委托类型作为方法的参数
5.Action委托
6.Func委托
7.通用类型冒泡排序
8.多播委托
二、Lambda表达式
1.匿名方法
2.Lambda表达式表示匿名方法
三、事件
1.什么是事件
2.事件应用——观察者模式
一、委托
1.什么是委托
从数据结构来讲,委托是和类一样是一种用户自定义类型;从设计模式来讲,委托(类)提供了方法(对象)的抽象。它存储的就是一系列具有相同签名和返回回类型的方法的地址。调用委托的时候,委托包含的所有方法将被执行。
2.委托类型的声明与初始化
声明:
- 以delegate关键字开头。
- 返回类型+委托类型名+参数列表
delegate void MyDelegate(int a);
这个委托可以指向带有一个int类型的参数,并且返回值是void的方法。
MyDelegate myDel;
初始化:
- myDel= new MyDelegate(GetNumber);
- myDel=GetNumber;
3.委托类型引用方法的调用
delegate int MyDelegate(int a);
MyDelegate myDel=GetNumber;
第一种:int res1 = myDel(10);//通过委托实例去调用myDel所引用的方法
第二种:int res2 = myDel.Invoke(10);//通过invoke方法调用myDel所引用的方法
两种方式调用方法都一样
4.使用委托类型作为方法的参数
5.Action委托
- Action是系统内置(预定义)的一个委托类型,它可以指向一个没有返回值,没有参数的方法 Action A1= GetNumber;
- Action可以后面通过泛型去指定action指向的方法的多个参数的类型 ,参数的类型跟Action后面声明的委托类型是对应着的(最多16个参数) Action<string> A2=PrintInt; Action<string, int> A3 = GetStrNum; A3("LOL",10);
6.Func委托
Func引用了一个带有一个返回值的方法,它可以传递0或者多到16个参数类型,和一个返回类型
Func<int> F1 = Test1;
Func<string, int> F2 = Test2;
Func<int, string, int> F3 = Test3;
7.通用类型冒泡排序
(1)对int类型数组进行排序
(2)通用的排序方法
8.多播委托
添加移除委托的引用
前面使用的委托都只包含一个方法的调用,但是委托也可以包含多个方法,这种委托叫做多播委托。使用多播委托就可以按照顺序调用多个方法,多播委托只能得到调用的最后一个方法的结果,一般我们把多播委托的返回类型声明为void。
二、Lambda表达式
1.匿名方法
到目前为止,使用委托,都是先定义一个方法,然后把方法给委托的实例。但还有另外一种使用委托的方式,不用去定义一个方法,应该说是使用匿名方法(方法没有名字)。
在这里相当于直接把要引用的方法直接写在了后面,优点是减少了要编写的代码,减少代码的复杂性。匿名方法 本质上是一个方法,只是没有名字,任何使用委托变量的地方都可以使用匿名方法赋值。
2.Lambda表达式表示匿名方法
从C#3.0开始,可以使用Lambda表达式代替匿名方法。只要有委托参数类型的地方就可以使用Lambda表达式。Lambda运算符“=>”的左边列出了需要的参数,如果是一个参数可以直接写 a=>(参数名自己定义),如果多个参数就使用括号括起来,参数之间以,间隔,无参数的的话不能省略()。
(1)如果Lambda表达式只有一条语句,在方法快内就不需要花括号和return语句,编译器会自动添加return语句,
Func<double,double> square = x=>x*x;
添加花括号,return语句和分号是完全合法的
Func<double,double> square = x=>
{
return x*x;
}
(2)如果Lambda表达式的实现代码中需要多条语句,就必须添加花括号和return语句。
三、事件
1.什么是事件
事件(event)基于委托,为委托提供了一个发布/订阅机制,我们可以说事件是一种具有特殊签名的委托。事件(event)是类或对象向其他类或对象通知发生的事情的一种特殊签名的委托。
事件的声明
public event 委托类型 事件名;
事件使用event关键词来声明,他的返回类值是一个委托类型。
通常事件的命名,以名字+Event 作为他的名称,在编码中尽量使用规范命名,增加代码可读性。
2.事件应用——观察者模式
一群老鼠在房间里面偷东西,猫进房间喵喵叫,老鼠逃跑,主人被吵醒。
该事件的实现