【C#】委托与事件

目录

一、委托

1.什么是委托

2.委托类型的声明与初始化

3.委托类型引用方法的调用

4.使用委托类型作为方法的参数

5.Action委托

6.Func委托

7.通用类型冒泡排序

8.多播委托

二、Lambda表达式

1.匿名方法

2.Lambda表达式表示匿名方法

三、事件

1.什么是事件

 2.事件应用——观察者模式


一、委托

1.什么是委托

从数据结构来讲,委托是和类一样是一种用户自定义类型;从设计模式来讲,委托(类)提供了方法(对象)的抽象。它存储的就是一系列具有相同签名和返回回类型的方法的地址。调用委托的时候,委托包含的所有方法将被执行。

2.委托类型的声明与初始化

声明:

  1. 以delegate关键字开头。
  2.  返回类型+委托类型名+参数列表

delegate void MyDelegate(int a);

这个委托可以指向带有一个int类型的参数,并且返回值是void的方法。

MyDelegate  myDel;

初始化:

  1. myDel= new MyDelegate(GetNumber);
  2. myDel=GetNumber;

3.委托类型引用方法的调用

delegate  int  MyDelegate(int a);

MyDelegate  myDel=GetNumber;

第一种:int  res1 = myDel(10);//通过委托实例去调用myDel所引用的方法

第二种:int  res2 = myDel.Invoke(10);//通过invoke方法调用myDel所引用的方法

两种方式调用方法都一样

4.使用委托类型作为方法的参数

【C#】委托与事件_第1张图片

5.Action委托

  1. Action是系统内置(预定义)的一个委托类型,它可以指向一个没有返回值,没有参数的方法 Action A1= GetNumber;
  2. Action可以后面通过泛型去指定action指向的方法的多个参数的类型 ,参数的类型跟Action后面声明的委托类型是对应着的(最多16个参数) Action A2=PrintInt; Action A3 = GetStrNum; A3("LOL",10);

6.Func委托

Func引用了一个带有一个返回值的方法,它可以传递0或者多到16个参数类型,和一个返回类型

 Func F1 = Test1;

 Func F2 = Test2;

 Func F3 = Test3;

7.通用类型冒泡排序

(1)对int类型数组进行排序

【C#】委托与事件_第2张图片

【C#】委托与事件_第3张图片

(2)通用的排序方法

【C#】委托与事件_第4张图片

【C#】委托与事件_第5张图片

【C#】委托与事件_第6张图片

8.多播委托

添加移除委托的引用

前面使用的委托都只包含一个方法的调用,但是委托也可以包含多个方法,这种委托叫做多播委托。使用多播委托就可以按照顺序调用多个方法,多播委托只能得到调用的最后一个方法的结果,一般我们把多播委托的返回类型声明为void。

二、Lambda表达式

1.匿名方法

到目前为止,使用委托,都是先定义一个方法,然后把方法给委托的实例。但还有另外一种使用委托的方式,不用去定义一个方法,应该说是使用匿名方法(方法没有名字)。

【C#】委托与事件_第7张图片

在这里相当于直接把要引用的方法直接写在了后面,优点是减少了要编写的代码,减少代码的复杂性。匿名方法 本质上是一个方法,只是没有名字,任何使用委托变量的地方都可以使用匿名方法赋值。

2.Lambda表达式表示匿名方法

从C#3.0开始,可以使用Lambda表达式代替匿名方法。只要有委托参数类型的地方就可以使用Lambda表达式。Lambda运算符“=>”的左边列出了需要的参数,如果是一个参数可以直接写  a=>(参数名自己定义),如果多个参数就使用括号括起来,参数之间以,间隔,无参数的的话不能省略()。

【C#】委托与事件_第8张图片

(1)如果Lambda表达式只有一条语句,在方法快内就不需要花括号和return语句,编译器会自动添加return语句,

  Func square = x=>x*x;     

  添加花括号,return语句和分号是完全合法的

  Func square = x=>

  {

  return x*x;

  }

(2)如果Lambda表达式的实现代码中需要多条语句,就必须添加花括号和return语句。

三、事件

1.什么是事件

事件(event)基于委托,为委托提供了一个发布/订阅机制,我们可以说事件是一种具有特殊签名的委托。事件(event)是类或对象向其他类或对象通知发生的事情的一种特殊签名的委托。

 事件的声明

public event 委托类型 事件名;

事件使用event关键词来声明,他的返回类值是一个委托类型。

通常事件的命名,以名字+Event 作为他的名称,在编码中尽量使用规范命名,增加代码可读性。

 2.事件应用——观察者模式

 一群老鼠在房间里面偷东西,猫进房间喵喵叫,老鼠逃跑,主人被吵醒。

【C#】委托与事件_第9张图片

 

 该事件的实现

【C#】委托与事件_第10张图片

【C#】委托与事件_第11张图片

【C#】委托与事件_第12张图片

【C#】委托与事件_第13张图片

你可能感兴趣的:(C#,1024程序员节,c#)