为什么Microsoft为自己的类使用扩展方法?

时间:2011-08-05 14:12:16

标签: c# extension-methods

为什么Microsoft对其创建的类使用扩展方法;而不是只是将方法添加到类,或创建子类?

5 个答案:

答案 0 :(得分:12)

微软这样做有很多原因。最大的两个是:

  1. 扩展方法适用于接口,而不仅仅是类。如果Microsoft简单地将Linq方法直接添加到IEnumerable,那么它将需要该接口的每个具体实现来实现这些方法。通过使它们成为扩展方法,根据现有的IEnumerable<>编写。行为,每个IEnumerable<> class自动获取它们。

  2. 对于3.0和3.5框架,核心System.dll是2.0库。在3.0和3.5中的所有新内容都添加在System.Core或其他相关库中。例如,获得List<>中的新方法的唯一方法存在于3.5但不在2.0中的类是在3.5库中提供的扩展方法。

答案 1 :(得分:2)

IgnoreRoute()上的{p> RouteCollection是一种扩展方法,因为它旨在与MVC框架一起使用,而不是核心ASP.NET应用程序。我的猜测是他们不想用非MVC应用程序不需要的方法污染RouteCollection类,同时仍允许MVC应用程序使用该类。

我不确定这种方法是否有意义(例如,因为他们可能刚刚创建了一个子类);由于更一般的原因,可能会使用扩展方法,其他人已经很好地回答了。

答案 2 :(得分:0)

这是Non-Virtual Interface模式的示例(类似于Template Method)。这是在具有多个(实现)继承的语言中使用的模式,在C#中执行此操作的方法是使用扩展方法。

基本思想是你只有非虚拟和纯虚拟(抽象)方法。接口的实现者(或类/ mixin的继承者,在具有多重继承的语言中)实现了一个小方法或一组方法(在本例中为GetEnumerator),并且作为回报,获得了一大堆依赖于它的方法一个抽象方法(如Select,Where,Aggregate等)

正如Michael Edenfield在他的回答中所说,如果我们想要暗示这种模式并且我们希望IEnumerable是一个接口,我们需要使用扩展方法。将IEnumerable变成一个抽象类是不好的,因为它应该是一个非常低成本的基本接口,应该放在任何集合上 - 实现IEnumerable不应该需要重新思考类层次结构,它应该是“免费的” ”。

答案 3 :(得分:0)

我认为主要原因是扩展此类方法非常容易。例如,如果您使用Linq扩展方法,您可以轻松编写自己的一组扩展方法(可能是foreach或某些特定的过滤器),这些方法可以使用microsoft方法进行操作:mylist.Where(...)。MyFilter(...)。选择(...)

答案 4 :(得分:-1)

我的两分钱:

因为扩展方法仅在.NET框架的更高版本中添加,所以它们已经具有.NET Framework 1,1.1,2.0和更新版本,然后在某些时候它们添加了扩展方法,因此他们使用它们来丰富特征集。现有课程的顶部。

相关问题