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

C# 为什么Microsoft对自己的类使用扩展方法?,c#,extension-methods,C#,Extension Methods,为什么微软对它创建的类使用扩展方法;不只是将方法添加到类或创建子类?我的两分钱: 由于扩展方法仅在.NET framework的较新版本中添加,因此它们已经有了.NET framework 1、1.1、2.0和更新版本,然后在某个时候添加了扩展方法,以便在现有类的基础上使用它们来丰富功能集。微软这样做的原因很多。最大的两个问题是: 扩展方法应用于接口,而不仅仅是类。如果微软只是将Linq方法直接添加到IEnumerable中,那么它也需要该接口的每个具体实现来实现这些方法。通过使它们成为根据现有

为什么微软对它创建的类使用扩展方法;不只是将方法添加到类或创建子类?

我的两分钱:


由于扩展方法仅在.NET framework的较新版本中添加,因此它们已经有了.NET framework 1、1.1、2.0和更新版本,然后在某个时候添加了扩展方法,以便在现有类的基础上使用它们来丰富功能集。

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

  • 扩展方法应用于接口,而不仅仅是类。如果微软只是将Linq方法直接添加到IEnumerable中,那么它也需要该接口的每个具体实现来实现这些方法。通过使它们成为根据现有IEnumerable行为编写的扩展方法,每个IEnumerable类都会自动获得它们

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

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

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

    这是一个模式示例(类似于)。这是一种在具有多重(实现)继承的语言中使用的模式,而在C#中实现这一模式的方法是使用扩展方法

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


    正如MichaelEdenfield在他的回答中所说,如果我们想要实现这个模式,并且我们想要IEnumerable成为一个接口,我们需要使用扩展方法。把IEnumerable变成一个抽象类是不好的,因为它应该是一个非常低成本的基本接口,应该放在几乎所有的集合上——实现IEnumerable不需要重新考虑类的层次结构,它应该几乎是“免费的”

    我认为主要原因是这种方法很容易扩展。例如,如果您使用Linq扩展方法,您可以轻松编写自己的一组扩展方法(可能是foreach或某些特定的筛选器),这些方法将与microsoft方法配合使用:mylist.Where(…).MyFilter(…)。选择(…)

    一般来说,回答这个问题将非常困难。请给出一些具体的例子。我在下面提到了这一点,但是
    RouteCollection
    Collectional的
    IgnoreRoute()
    方法与.NET 2->3增强类似。大多数基类与非MVC ASP.NET完全相同,但MVC框架希望这些基类与MVC特性“更好地工作”。派生一个child类在技术上是可行的,但在哲学上有点不正确——实际上没有两个RouteCollection类;有一个类,如果你“升级”到MVC框架,它会变得更智能。为什么这是一个原因?让我们看看Linq扩展方法。为了使用linq方法,您应该使用.NETFramework 3.5或更高版本,对吗?无论如何,您不能继续使用.NET1、1.1或2.0并使用linq方法。因此,您必须迁移到.NET3.5,即使linq是在类(如List等)中实现的,它仍然可以在客户机代码中很好地工作,如:mylist.Where().Select()。。。