C# 中的委托和事件简介
在 .NET 中委托提供后期绑定机制。 后期绑定意味着调用方在你所创建的算法中至少提供一个方法来实现算法的一部分。
例如,在天文应用程序中对恒星列表进行排序。 你可以选择按照恒星与地球的距离、恒星的大小或者可以感知的亮度来对它们进行排序。
在所有这些情况下,Sort() 方法本质上执行的是同一操作:基于某种比较方法对列表中的项目进行排序。 对于每个排序顺序,比较两种恒星的代码是不同的。
这些类型的解决方案已在软件中使用了半个世纪。 C# 语言的委托概念提供一流的语言支持和以此概念为中心的类型安全性。
正如你将在本系列文章的后续部分所见,为此类算法编写的 C# 代码是类型安全的。 编译器可确保类型与参数和返回类型相匹配。
对于类似的方案,已将函数指针添加到 C# 9,其中你需要对调用约定有更多的控制。 使用添加到委托类型的虚方法调用与委托关联的代码。 使用函数指针,可以指定不同的约定。
委托的语言设计目标
语言设计人员针对最终成为委托的功能列举了一些目标。
团队想要拥有可用于任何后期绑定算法的公共语言构造。 委托促使开发人员学习一个概念,并在许多不同的软件问题中使用这同一概念。
其次,该团队希望支持单一和多播方法调用。 (多播委托是将多个方法调用链接在一起的委托。你将在本系列文章的后面部分看到示例。)
团队想要委托在所有 C# 构造中支持开发人员所预期的相同的类型安全性。
最后,团队认识到事件模式是一个特定模式,委托或任何后期绑定算法在这种模式下都很有用。 团队需要确保委托的代码可以为 .NET 事件模式提供基础。
所有这些工作的结果是 C# 和 .NET 中的委托和事件支持。
本系列文章的剩余部分将介绍语言功能、库支持和使用委托和事件时使用的通用语法结构。 本文内容:
delegate
关键字和它所生成的代码。System.Delegate
类中的功能,以及如何使用这些功能。- 如何创建类型安全的委托。
- 如何创建可通过委托调用的方法。
- 如何使用 Lambda 表达式来处理委托和事件。
- 作为 LINQ 的构建基块的委托的用途。
- 委托如何成为 .NET 事件模式的基础,以及委托和事件之间的区别。
让我们开始吧。