C# 语法进阶 委托

1.委托

委托是一个引用类型,其实他是一个类,保存方法的指针
(指针:保存一个变量的地址)他指向一个方法,当我们调用委托的时候这个方法就立即被执行

关键字:delegate

C# 语法进阶 委托_第1张图片
运行结果:
C# 语法进阶 委托_第2张图片
思考:
能直接通过方法名调用方法,为什么需要使用委托呢
C# 语法进阶 委托_第3张图片
C# 语法进阶 委托_第4张图片

为什么要有委托

1.新建Vip 类
C# 语法进阶 委托_第5张图片
2,使用委托
(1)不适用委托的情况
C# 语法进阶 委托_第6张图片
运行结果:
C# 语法进阶 委托_第7张图片
(2)想把价格判断独立出来,考虑别人可能需要动态修改价格
一。修改Learn类
C# 语法进阶 委托_第8张图片
二、定义一个供委托使用的方法
C# 语法进阶 委托_第9张图片

三、使用
C# 语法进阶 委托_第10张图片
四、运行结果
C# 语法进阶 委托_第11张图片
委托让用户可以自定义方法内部的实现,给用户更多自由

若修改为5999,则只需要添加新的扩展类
C# 语法进阶 委托_第12张图片
修改委托中的方法。
C# 语法进阶 委托_第13张图片
达到不修改源码,横向扩展的目的。

委托与冒泡排序

泛型: 他就是把类型做到了通用
反射:能找出我们DLL文件里面得各种信息
特性:特性是让我们的类,方法,属性,参数 之类的。在不修改源码的情况下,产生了更多功能,或者其他功能(打一个标签就生成了新的功能,本质他其实就是AOP的另一种 实现方式。)
委托:指向方法的指针。通过委托可以调用方法。

案例

冒泡排序:
C# 语法进阶 委托_第14张图片
调用:
C# 语法进阶 委托_第15张图片

运行结果:
C# 语法进阶 委托_第16张图片

若此时需要改为降序排序,就需要修改判断条件

新建枚举:
C# 语法进阶 委托_第17张图片
修改方法:
C# 语法进阶 委托_第18张图片
此种方法,在类型特别多的情况下 并不适用

方式二:使用委托改进该方式。
新建DelegateSort 类,放入冒泡排序方法
C# 语法进阶 委托_第19张图片
写一个方法达到 传入表达式的作用
C# 语法进阶 委托_第20张图片

修改原方法
首先修改传入参数,添加委托类型
C# 语法进阶 委托_第21张图片
然后修改判断条件
C# 语法进阶 委托_第22张图片
调用:
C# 语法进阶 委托_第23张图片
结果:
C# 语法进阶 委托_第24张图片
此时修改排序方式,只需要新添方法
C# 语法进阶 委托_第25张图片
调用委托就相当于调用方法,可以把逻辑抽离出来

泛型委托

(1) 构造一个泛型委托
C# 语法进阶 委托_第26张图片
调用:
C# 语法进阶 委托_第27张图片
运行结果:
在这里插入图片描述
因为是泛型委托,所以可以达到通用效果
C# 语法进阶 委托_第28张图片
运行结果:
C# 语法进阶 委托_第29张图片
实际这种方式,官方已经定义好了 换成官方版本
在这里插入图片描述

带返回值的泛型委托:
首先定义一个带返回值的方法
C# 语法进阶 委托_第30张图片

在这里插入图片描述

最多可以支持16个参数
C# 语法进阶 委托_第31张图片
C# 语法进阶 委托_第32张图片

多播委托

创建多播委托类:
C# 语法进阶 委托_第33张图片
C# 语法进阶 委托_第34张图片
编译:
C# 语法进阶 委托_第35张图片
查看反编译代码
C# 语法进阶 委托_第36张图片
C# 语法进阶 委托_第37张图片

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
【1】每一个委托都是继承自MulticastDelegate ,也就是每个委托都是多播委托。
【2】带返回值的多播委托只返回最后一个方法的值
【3】多播委托可以用加减号来操作方法的增加或者减少
【4】给委托传递相同的方式时, 生成的委托实列也是相同的(也就是同一个委托)

简写方式:
C# 语法进阶 委托_第38张图片
多播委托:
新建几个方法
C# 语法进阶 委托_第39张图片
原版方法:
在这里插入图片描述
方法调用:
在这里插入图片描述
调用结果:
C# 语法进阶 委托_第40张图片

减少一个方法:
C# 语法进阶 委托_第41张图片

调用结果:
在这里插入图片描述
简写方式:
C# 语法进阶 委托_第42张图片
运行结果:
在这里插入图片描述
通过循环找出所有的委托链
C# 语法进阶 委托_第43张图片
调用结果与上述方法相同

使用lamada表达式方式:
C# 语法进阶 委托_第44张图片
运行结果:

C# 语法进阶 委托_第45张图片
使用lamada表达式的话 编译后默认都给方法取了一个新名称,所以无法减去func3
使用方法名的方式:
C# 语法进阶 委托_第46张图片
调用结果:
C# 语法进阶 委托_第47张图片

委托事件

事件:委托的安全版本
【1】 在定义事件类的外部,他是不能使用=号来操作,只能使用+=
【2】 在定义事件类的外部不能调用事件,另外事件就是在委托的前面增加一个event 关键字

C# 语法进阶 委托_第48张图片
写在类中,并新建类,声明两个方法
C# 语法进阶 委托_第49张图片
事件在哪个类中声明 就在哪个类中调用
C# 语法进阶 委托_第50张图片

修改:
C# 语法进阶 委托_第51张图片
调用
C# 语法进阶 委托_第52张图片
运行结果:
C# 语法进阶 委托_第53张图片

WinForm 里的事件

添加一个新项目:
C# 语法进阶 委托_第54张图片

添加一个Windows 窗体应用
C# 语法进阶 委托_第55张图片
C# 语法进阶 委托_第56张图片
首先创建一个button
C# 语法进阶 委托_第57张图片
C# 语法进阶 委托_第58张图片
双击进入该事件方法
C# 语法进阶 委托_第59张图片
C# 语法进阶 委托_第60张图片

导航到click的定义,观察事件是如何定义的
C# 语法进阶 委托_第61张图片
查看他的委托定义:
C# 语法进阶 委托_第62张图片

C# 语法进阶 委托_第63张图片

在private System.Windows.Forms.Button button1:对象里定义并且调用了事件
对象的定义和调用在同一个类中。
C# 语法进阶 委托_第64张图片
查看Button
C# 语法进阶 委托_第65张图片

F12 查看OnClick方法
在此处调用了事件
C# 语法进阶 委托_第66张图片

查看EventArgs 参数:
C# 语法进阶 委托_第67张图片
EventArgs事件参数的基类

测试:
C# 语法进阶 委托_第68张图片
C# 语法进阶 委托_第69张图片
运行结果:
点一个按钮会出现三个框
C# 语法进阶 委托_第70张图片
实际场景:
比如在付款前,付款后需要进行什么操作

自定义标准事件

【1】 定义一个委托
【2】 定义一个调用和定义事件的类
【3】 订阅事件
【4】 订阅者

新建控制台应用程序
C# 语法进阶 委托_第71张图片
定义事件的发布者
C# 语法进阶 委托_第72张图片
事件订阅者:事件方法编写和订阅功能
C# 语法进阶 委托_第73张图片

C# 语法进阶 委托_第74张图片
将参数改为自己定义的
C# 语法进阶 委托_第75张图片
C# 语法进阶 委托_第76张图片
复制一个Publisher2

调用:
C# 语法进阶 委托_第77张图片
运行结果:
在这里插入图片描述

你可能感兴趣的:(c#,开发语言)