繁体   English   中英

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

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

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

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

谢谢你。

原因有三点:

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM