为什么 LINQ 运算符被定义为 IEnumerable 接口上的扩展方法,而不是接口本身的一部分? C#

Why are LINQ operators defined as extension methods on IEnumerable interface and are not part of the interface itself? C#

因此,扩展方法用于向 class 添加功能,而无需修改其当前代码。我读到 LINQ 运算符是这样定义的。

我的问题是,当我们知道每个实现 IEnumerable 的 class 都需要 LINQ 运算符时,为什么不直接在 IEnumerable 接口中定义 LINQ 运算符?为什么要使用扩展方法?

谢谢。

原因有三:

  1. 更改 IEnumerable 的接口对现有使用者来说是一项重大更改。由于 .NET 3.5(引入 LINQ 时)不是生产中唯一的 .NET 版本(当时有 .NET 2.0 和 .NET 1.1),Microsoft 的 .NET 团队必须特别小心更改。

  2. 软件架构的一个基本部分是理解 Object SOLID 设计原则 "the Open-Closed" principle (the "O" in SOLID). Also known as Composition Over Inheritance。也就是说,当你在构建软件时,更喜欢乐高积木可以一起工作来组成你想要的乐高结果,而不是让乐高积木的所有功能都内置在它的继承链中。并非每块乐高积木都需要乐高轮的功能,但如果您使用继承,每块乐高积木都可以访问该功能——可能不是您想要的。

    通过使用组合和设置新的扩展方法语法; Microsoft 可以向 Enumerable 接口添加功能,而不必担心 IEnumerable 的现有使用者,并且 none 这些实现必须实现整套 LINQ 运算符,如果将其嵌入到IEnumerable 接口。

  3. IEnumerableIEnumerable<T> 的命名很简单:为遍历集合的通用方法提供接口。这样每个需要迭代集合的人都可以使用这个接口。如果他们开始向该接口添加与枚举无关的内容,消费者将开始感到困惑。 “这东西又是干嘛的?”

    软件开发的另一个原则是单一职责原则(SOLID 中的 S),当你有一个 class 或接口负责两个或多个事情时,是时候重新审视了为什么该接口存在。