当前位置: 首页 > news >正文

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

调用:
在这里插入图片描述
运行结果:
在这里插入图片描述

相关文章:

  • 基于web的电影院购票系统
  • [C#]winform利用seetaface6实现C#人脸检测活体检测口罩检测年龄预测性别判断眼睛状态检测
  • vue项目使用typescript创建抽象类及其使用
  • 全链路压力测试有哪些主要作用
  • 虽然是个去年的旧新闻,但这透露了IBM的新去向
  • docker/华为云cce 部署nacos 2.3.0 集群模式
  • sqlilabs第四十九五十关
  • Laravel 使用rdkafka_laravel详细教程(实操避坑)
  • Google上架:2024年一月政策限制之 AI 生成的内容
  • 【动态规划】【 数学】C++算法:514自由之路
  • [SpringBoot]接口的多实现:选择性注入SpringBoot接口的实现类
  • 求幸存数之和 - 华为OD统一考试
  • 建模软件Rhinoceros mac介绍说明
  • Windows RPC运行时漏洞事后总结
  • 微软最新研究成果:使用GPT-4合成数据来训练AI模型,实现SOTA!
  • bearychat的java client
  • ES6--对象的扩展
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • laravel 用artisan创建自己的模板
  • Rancher-k8s加速安装文档
  • 记一次用 NodeJs 实现模拟登录的思路
  • 马上搞懂 GeoJSON
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 如何胜任知名企业的商业数据分析师?
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 世界上最简单的无等待算法(getAndIncrement)
  • 我是如何设计 Upload 上传组件的
  • 项目实战-Api的解决方案
  • 异常机制详解
  • 怎么将电脑中的声音录制成WAV格式
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ###STL(标准模板库)
  • #laravel 通过手动安装依赖PHPExcel#
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • (007)XHTML文档之标题——h1~h6
  • (3)nginx 配置(nginx.conf)
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (第61天)多租户架构(CDB/PDB)
  • (二)WCF的Binding模型
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (小白学Java)Java简介和基本配置
  • ***原理与防范
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .net6使用Sejil可视化日志
  • .NET中两种OCR方式对比
  • @TableLogic注解说明,以及对增删改查的影响
  • [④ADRV902x]: Digital Filter Configuration(发射端)
  • [COI2007] Sabor
  • [CSS]文字旁边的竖线以及布局知识
  • [C语言]——C语言常见概念(1)
  • [EMWIN]FRAMEWIN 与 WINDOW 的使用注意
  • [exgcd] Jzoj P1158 荒岛野人
  • [leetcode]Symmetric Tree