C# 语法进阶 委托

1.委托

委托是一个引用类型,其实他是一个类,保存方法的指针

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

关键字:delegate

运行结果:

思考:

能直接通过方法名调用方法,为什么需要使用委托呢

为什么要有委托

1.新建Vip 类

2,使用委托

(1)不适用委托的情况

运行结果:

(2)想把价格判断独立出来,考虑别人可能需要动态修改价格

一。修改Learn类

二、定义一个供委托使用的方法

三、使用

四、运行结果

委托让用户可以自定义方法内部的实现,给用户更多自由

若修改为5999,则只需要添加新的扩展类

修改委托中的方法。

达到不修改源码,横向扩展的目的。

委托与冒泡排序

泛型: 他就是把类型做到了通用

反射:能找出我们DLL文件里面得各种信息

特性:特性是让我们的类,方法,属性,参数 之类的。在不修改源码的情况下,产生了更多功能,或者其他功能(打一个标签就生成了新的功能,本质他其实就是AOP的另一种 实现方式。)

委托:指向方法的指针。通过委托可以调用方法。

案例

冒泡排序:

调用:

运行结果:

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

新建枚举:

修改方法:

此种方法,在类型特别多的情况下 并不适用

方式二:使用委托改进该方式。

新建DelegateSort 类,放入冒泡排序方法

写一个方法达到 传入表达式的作用

修改原方法

首先修改传入参数,添加委托类型

然后修改判断条件

调用:

结果:

此时修改排序方式,只需要新添方法

调用委托就相当于调用方法,可以把逻辑抽离出来

泛型委托

(1) 构造一个泛型委托

调用:

运行结果:

因为是泛型委托,所以可以达到通用效果

运行结果:

实际这种方式,官方已经定义好了 换成官方版本

带返回值的泛型委托:

首先定义一个带返回值的方法

最多可以支持16个参数

多播委托

创建多播委托类:

编译:

查看反编译代码



【1】每一个委托都是继承自MulticastDelegate ,也就是每个委托都是多播委托。

【2】带返回值的多播委托只返回最后一个方法的值

【3】多播委托可以用加减号来操作方法的增加或者减少

【4】给委托传递相同的方式时, 生成的委托实列也是相同的(也就是同一个委托)

简写方式:

多播委托:

新建几个方法

原版方法:

方法调用:

调用结果:

减少一个方法:

调用结果:

简写方式:

运行结果:

通过循环找出所有的委托链

调用结果与上述方法相同

使用lamada表达式方式:

运行结果:


使用lamada表达式的话 编译后默认都给方法取了一个新名称,所以无法减去func3

使用方法名的方式:

调用结果:

委托事件

事件:委托的安全版本

【1】 在定义事件类的外部,他是不能使用=号来操作,只能使用+=

【2】 在定义事件类的外部不能调用事件,另外事件就是在委托的前面增加一个event 关键字

写在类中,并新建类,声明两个方法

事件在哪个类中声明 就在哪个类中调用

修改:

调用

运行结果:

WinForm 里的事件

添加一个新项目:

添加一个Windows 窗体应用

首先创建一个button

双击进入该事件方法

导航到click的定义,观察事件是如何定义的

查看他的委托定义:

在private System.Windows.Forms.Button button1:对象里定义并且调用了事件
对象的定义和调用在同一个类中。

查看Button

F12 查看OnClick方法

在此处调用了事件

查看EventArgs 参数:

EventArgs事件参数的基类

测试:

运行结果:

点一个按钮会出现三个框

实际场景:

比如在付款前,付款后需要进行什么操作

自定义标准事件

【1】 定义一个委托

【2】 定义一个调用和定义事件的类

【3】 订阅事件

【4】 订阅者

新建控制台应用程序

定义事件的发布者

事件订阅者:事件方法编写和订阅功能

将参数改为自己定义的

复制一个Publisher2

调用:

运行结果:

相关推荐
arbboter7 分钟前
【自动化】深入浅出UIAutomationClient:C#桌面自动化实战指南
运维·c#·自动化·inspect·uiautomation·uia·桌面自动化
听情歌落俗8 分钟前
MATLAB3-1变量-台大郭彦甫
开发语言·笔记·算法·matlab·矩阵
zhangfeng11331 小时前
在 R 语言里,`$` 只有一个作用 按名字提取“列表型”对象里的单个元素 对象 $ 名字
开发语言·windows·r语言
文弱书生6561 小时前
5.后台运行设置和包设计与实现
服务器·开发语言·c#
编码浪子1 小时前
趣味学RUST基础篇(异步补充)
开发语言·后端·rust
songroom1 小时前
Rust : 关于Deref
开发语言·后端·rust
qq_401700411 小时前
QT子线程与GUI线程安全交互
开发语言·qt
高-老师1 小时前
R语言生物群落(生态)数据统计分析与绘图实践技术应用
开发语言·r语言·生物群落
Joy-鬼魅1 小时前
怎么生成qt的pro文件
开发语言·qt
Pocker_Spades_A3 小时前
Python快速入门专业版(二十六):Python函数基础:定义、调用与返回值(Hello函数案例)
开发语言·python