为什么LINQ运算符被定义为IEnumerable接口上的扩展方法,并且不属于接口本身? C#

问题描述 投票:1回答:1

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

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

谢谢。

c# linq oop interface extension-methods
1个回答
4
投票

原因是三方面的:

  1. 更改IEnumerable的界面对于现有使用者来说是一项重大变化。由于.NET 3.5(当引入LINQ时)并不是生产中唯一的.NET版本(当时有.NET 2.0和.NET 1.1),因此Microsoft的.NET团队在更改时必须格外小心。
  2. 架构软件的一个基本部分是理解Composition Over Inheritance的面向对象设计原理。就是说,当您构建软件时,宁愿拥有可以一起工作的乐高积木来组合所需的乐高积木,而没有乐高积木将所有这些功能内置到其继承链中。并非每个乐高积木都需要乐高滚轮的功能,但是如果您使用继承,则每个乐高积木都可以使用该功能-可能不是您想要的。

    通过使用合成并设置新的扩展方法语法; Microsoft可以在Enumerable接口上添加功能,而不必担心IEnumerable的现有使用者。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.