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

标签 c# linq oop interface extension-methods

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

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

谢谢。

最佳答案

原因有三:

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

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

    通过使用组合和设置新的扩展方法语法; Microsoft 可以向 Enumerable 接口(interface)添加功能,而不必担心 IEnumerable 的现有使用者,并且这些实现中没有一个必须实现整套 LINQ 运算符,如果它被嵌入到 IEnumerable 接口(interface)中,他们将不得不这样做。

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

    软件开发中的另一个原则是单一职责原则(SOLID 中的 S),当您有一个类或接口(interface)负责两个或多个事物时,是时候重新审视该接口(interface)存在的原因了。

关于c# - 为什么 LINQ 运算符被定义为 IEnumerable 接口(interface)上的扩展方法,而不是接口(interface)本身的一部分? C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60075386/

相关文章:

c# - 等待所有工作线程结束

oop - 类方法 : Passing private data fields in private methods

hibernate - 使用 JPA/Hibernate 进行继承映射

c# - 如何使用 AutoMapper 正确配置 `int?` 到 `int` 投影?

c# - 在 c# 的 datagridview 中交换行

c# - 有人可以解释此Linq查询吗?

.net - 使用 linq 和 sql 比较两个列表

c# - Linq Sum 与 group by

c++ - 自定义类函数引起的内存错误

c# - xunit 是否有参数化测试夹具?