C# 为什么选择扩展方法?

C# 为什么选择扩展方法?,c#,C#,许多BCL类都有方法和扩展方法。当Microsoft拥有其类的源代码时,选择ExtensionMethods而不是方法的设计决策是什么? 非常感谢。 Smith实际上,BCL中的大多数扩展方法并不适用于类,而是适用于接口,接口是扩展方法的关键功能 例如,几乎所有LINQ to对象都是作为IEnumerable接口的扩展实现的,而不是类列表、HashSet等的扩展 因为接口没有功能(只是一个契约),所以向接口添加扩展方法可以帮助您访问接口本身。当实现只需要知道接口的使用而不需要知道实现细节(本身)

许多BCL类都有方法和扩展方法。当Microsoft拥有其类的源代码时,选择ExtensionMethods而不是方法的设计决策是什么? 非常感谢。
Smith

实际上,BCL中的大多数扩展方法并不适用于类,而是适用于接口,接口是扩展方法的关键功能

例如,几乎所有LINQ to对象都是作为
IEnumerable
接口的扩展实现的,而不是类
列表、HashSet
等的扩展

因为接口没有功能(只是一个契约),所以向接口添加扩展方法可以帮助您访问接口本身。当实现只需要知道接口的使用而不需要知道实现细节(本身)时,这尤其方便

微软确实一直在他们的BCL类中添加新方法(当然,他们尽量避免破坏更改)。但是我相信他们在BCL中使用的大多数扩展方法都是在接口上使用的,而不是为了添加可以通过新方法直接添加到类/结构中的功能

因此,简而言之,当Microsoft选择向单个
类(或具有公共基类的族)添加功能时,他们可能会直接添加该方法(所有条件都相同),但如果他们想将新方法应用于给定接口的所有实现,他们可能会在该接口上使用扩展方法


也要记住这一点!因为微软给了我们扩展方法,它也适用于他们没有创建的类!例如,您创建的任何实现了
IEnumerable
的类都可以获得LINQ的功能以及额外的好处,即使您没有继承公共基类,等等。

实际上,BCL中的大多数扩展方法都不应用于类,而是应用于接口,接口是扩展方法的关键功能

例如,几乎所有LINQ to对象都是作为
IEnumerable
接口的扩展实现的,而不是类
列表、HashSet
等的扩展

因为接口没有功能(只是一个契约),所以向接口添加扩展方法可以帮助您访问接口本身。当实现只需要知道接口的使用而不需要知道实现细节(本身)时,这尤其方便

微软确实一直在他们的BCL类中添加新方法(当然,他们尽量避免破坏更改)。但是我相信他们在BCL中使用的大多数扩展方法都是在接口上使用的,而不是为了添加可以通过新方法直接添加到类/结构中的功能

因此,简而言之,当Microsoft选择向单个
类(或具有公共基类的族)添加功能时,他们可能会直接添加该方法(所有条件都相同),但如果他们想将新方法应用于给定接口的所有实现,他们可能会在该接口上使用扩展方法

也要记住这一点!因为微软给了我们扩展方法,它也适用于他们没有创建的类!例如,您创建的任何实现
IEnumerable
的类都可以获得LINQ的功能以及额外的好处,即使您没有继承公共基类,等等

选择ExtensionMethods而不是方法的设计决策是什么

在我看来,选择可拓方法的一个重要原因是它促进了实体的开/闭原理,即打开进行可拓,关闭进行修改

选择ExtensionMethods而不是方法的设计决策是什么


在我看来,选择扩展方法的一个重要原因是它促进了SOLID的开放/封闭原则,即开放用于扩展关闭用于修改

Microsoft倾向于使用扩展方法来实现适用于大量不同代码基的功能。例如,LINQ几乎完全作为扩展方法实现。(您指出的大多数方法(如果不是所有的话)都是泛型LINQ方法,而不是特定于这些类的方法)

这有很多好处。首先,如果不使用LINQ,则不必包含对LINQ库的引用或使用。这减少了代码膨胀

其次,LINQ可以应用于实现IEnumerable的任何对象,如果实现枚举器,则包括您自己的代码。您不必像编写其他代码那样编写此代码

第三,它允许将功能分解为离散单元,从而更好地分离关注点,并使类更易于维护


还有很多其他潜在的好处,但是这个列表应该足以说明扩展方法是实现这些方法的最佳方式。

微软倾向于使用扩展方法来实现适用于大量不同代码库的功能。例如,LINQ几乎完全作为扩展方法实现。(您指出的大多数方法(如果不是所有的话)都是泛型LINQ方法,而不是特定于这些类的方法)

这有很多好处。首先,如果不使用LINQ,则不必包含对LINQ库的引用或使用。这减少了代码膨胀

其次,LINQ可以应用于实现IEnumerable的任何对象,如果实现枚举器,则包括您自己的代码。您不必像编写其他代码那样编写此代码

第三,它允许将功能分解为离散单元,从而更好地分离关注点,并使类更易于维护


还有很多其他潜在的好处,但是这个列表应该足以说明扩展方法是实现这些方法的最佳方式。

因为虽然Microsoft有源代码。。。我们没有