C# 中的委托和事件简介

在 .NET 中委托提供后期绑定机制。 后期绑定意味着创建一个算法,其中调用方也提供至少一个实现算法部分的方法。

例如,考虑对天文学应用程序中的恒星列表进行排序。 你可以选择按它们与地球的距离或恒星的震级或他们感知到的亮度对这些恒星进行排序。

在所有这些情况下,Sort() 方法基本上都执行了相同的作:根据一些比较排列列表中的项。 编写用于比较两个星星的代码在每种排序顺序中都是不同的。

这些解决方案已在软件中使用了半个世纪。 C# 语言中的委托概念提供一流的语言支持,并在委托概念中实现类型安全性。

如本系列后面所示,为此类算法编写的 C# 代码是类型安全的。 编译器确保类型与参数和返回类型匹配。

函数指针支持类似的方案,其中你需要对调用约定有更多的控制。 使用虚拟方法调用与委托类型关联的代码,此方法被添加到委托类型中。 使用函数指针可以指定不同的约定。

委托的语言设计目标

语言设计人员针对最终成为委托的功能列举了一些目标。

团队想要一个可用于任何后期绑定算法的公共语言构造。 委托使开发人员能够了解一个概念,并在许多不同的软件问题中使用同一概念。

其次,团队希望同时支持单播和多播方法调用。 (多播委托是将多个方法调用链接在一起的委托。你将在本系列文章的后面部分看到示例。)

团队想要委托在所有 C# 构造中支持开发人员所预期的相同的类型安全性。

最后,团队认识到事件模式是一种特定的模式,其中委托或任何后期绑定算法都很有用。 团队希望确保委托的代码可以为 .NET 事件模式提供基础。

所有这些工作的结果是在 C# 和 .NET 中实现了委托和事件支持。

本系列中的其余文章将介绍处理委托和事件时使用的语言功能、库支持和常见习惯。 您将了解:

  • 关键字 delegate 及其生成的代码。
  • 类中的 System.Delegate 功能以及如何使用这些功能。
  • 如何创建类型安全的委托。
  • 如何创建可通过委托调用的方法。
  • 如何使用 Lambda 表达式来处理委托和事件。
  • 委托如何构成 LINQ 的基础组成部分之一。
  • 委托如何成为 .NET 事件模式的基础,以及委托和事件之间的区别。

让我们开始吧。

下一步