c#基础-委托
1|01.1 概述
1|1定义
-
委托(delegate)是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。 在实例化委托时,你可以将其实例与任何具有兼容签名和返回类型的方法相关联。 你可以通过委托实例调用方法。
-
委托用于将方法作为参数传递给其他方法。 事件处理程序就是通过委托调用的方法
-
可将任何可访问类或结构中与委托类型匹配的任何方法分配给委托。 该方法可以是静态方法,也可以是实例方法
-
将方法作为参数进行引用的能力使委托成为定义回调方法的理想选择。 可编写一个比较应用程序中两个对象的方法。 该方法可用在排序算法的委托中。 由于比较代码与库分离,因此排序方法可能更常见
-
Delegate至少
0
个参数,至多32
个参数,可以无返回值,也可以指定返回值类型
1|2属性
委托的属性 |
---|
委托类似于 C++ 函数指针,但委托完全面向对象,不像 C++ 指针会记住函数,委托会同时封装对象实例和方法。 |
委托允许将方法作为参数进行传递。 |
委托可用于定义回调方法。 |
委托可以链接在一起;例如,可以对一个事件调用多个方法。 |
方法不必与委托类型完全匹配。 有关详细信息,请参阅使用委托中的变体。 |
使用 Lambda 表达式可以更简练地编写内联代码块。 Lambda 表达式(在某些上下文中)可编译为委托类型。 若要详细了解 lambda 表达式,请参阅 lambda 表达式 |
2|01.2 委托的使用
委托是安全封装方法的类型,类似于 C 和 C++ 中的函数指针。 与 C 函数指针不同的是,委托是面向对象的、类型安全的和可靠的
2|11.2.1 委托构造
委托对象通常可采用两种方式进行构造
- 使用方法名称构造委托对象
- 使用 Lambda 表达式构造委托对象
- 使用匹配签名声明委托类型并声明方法
- 声明匿名方法
2|21.2.2 查询委托
委托类型派生自 .NET 中的 Delegate 类。 委托类型是密封的,不能从其派生出自定义类,以在委托上调用该类定义的方法和属性。 例如,查询委托调用列表中方法的数量
2|31.2.3 映射到静态方法和实例方法
3|01.3 委托的多播
委托的多播是指一个委托对象可以封装多个方法,当调用委托时,它会依次调用封装的多个方法。多播委托允许将多个方法链接在一起,以便在调用委托时依次触发它们,仅可合并类型相同的委托。
在 C# 中,多播委托使用 + 和 - 运算符来添加和移除方法。添加方法使用 += 运算符,移除方法使用 -= 运算符
output
4|01.4 泛型委托
泛型:可以根据要处理的精确数据类型定制方法、类、结构或接口。 例如,不使用允许键和值为任意类型的 Hashtable 类,而使用 Dictionary<TKey,TValue> 泛型类并指定允许的密钥和值类型。 泛型的优点包括:代码的可重用性增加,类型安全性提高
泛型委托:不需要定义委托性质,可直接定义委托
- 协变
- 协变允许将一个派生类型(子类)转换为一个基类型(父类)。
- 在泛型接口和委托中,如果泛型类型参数声明了
out
修饰符,那么这个类型参数就支持协变。 - 协变的类型参数可以用作方法的返回类型。
- 示例:将
IEnumerable<Derived>
赋值给IEnumerable<Base>
。
- 逆变
- 逆变允许将一个基类型(父类)转换为一个派生类型(子类)。
- 在泛型委托中,如果泛型类型参数声明了
in
修饰符,那么这个类型参数就支持逆变。 - 逆变的类型参数可以用作方法的参数类型。
- 示例:将
Action<Base>
赋值给Action<Derived>
。
4|11.4.1 Func
使用协变类型参数的委托可以让派生类委托转为基类委托
- Func必须要有返回值,最多可以有16个参数
output
4|21.4.2 Action
使用逆变类型参数的委托可以让基类委托转为派生类委托
- Action没有返回值,最多可以有16个参数
5|01.4.3 Func 和 Action区别
特点 | Func | Action |
---|---|---|
参数数量 | 0 到 16 个 | 0 到 16 个 |
返回值 | 有返回值(泛型类型) | 无返回值 |
委托类型示例 | Func |
Action |
示例用途 | 计算、操作等有返回值的方法 | 打印、通知等无返回值的方法 |
6|01.5 Predicate
一种专门的委托类型 Predicate,此类型返回单个值的测试结果
对于任何 Predicate
类型,均存在一个在结构上等效的 Func
类型,例如:
7|01.6 委托与事件
7|11.6.1 事件介绍
- 使用
+=
、-=
进行订阅和取消订阅 - 事件(Event) 基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些提示信息,如系统生成的通知。应用程序需要在事件发生时响应事件。例如,中断。
- C# 中使用事件机制实现线程间的通信
- 事件在类中声明且生成,且通过使用同一个类或其他类中的委托与事件处理程序关联。包含事件的类用于发布事件。这被称为 发布器(publisher) 类。其他接受该事件的类被称为 订阅器(subscriber) 类。事件使用 发布-订阅(publisher-subscriber) 模型。
- 发布器(publisher) 是一个包含事件和委托定义的对象。事件和委托之间的联系也定义在这个对象中。发布器(publisher)类的对象调用这个事件,并通知其他的对象。
- 订阅器(subscriber) 是一个接受事件并提供事件处理程序的对象。在发布器(publisher)类中的委托调用订阅器(subscriber)类中的方法(事件处理程序)
- 类之外的代码无法引发事件,也不能执行任何其它操作。
7|21.6.2 事件调用
-
定义使用
event
关键字的事件,该事件(在此示例中,为EventHandler<FileListArgs>
)的类型必须为委托类型: -
想要引发事件时,使用委托调用语法调用事件处理程序:
-
处理程序方法通常为前缀“On”,后跟事件名称,如下所示:
-
.net
事件委托的标准签名
7|31.6.3 实例
output
- 一个简单的用于热水锅炉系统故障排除的应用程序。当维修工程师检查锅炉时,锅炉的温度和压力会随着维修工程师的备注自动记录到日志文件中
output
- 事件委托签名查找文件并打印
- 异步事件订阅
__EOF__

本文链接:https://www.cnblogs.com/InsiApple/p/17650486.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文来自博客园,作者:InsiApple,转载请注明原文链接:https://www.cnblogs.com/InsiApple/p/17650486.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)