关于使用扩展方法的做法有变化吗?还是有两种思想流派?

时间:2012-05-23 16:29:36

标签: c# extension-methods

当我第一次了解扩展方法时,我读了this

  

通常,我们建议您实施扩展方法   谨慎而且只有在你必须的时候。客户端代码   必须通过创建新类型来扩展现有类型   从现有类型派生而来。

但是,我有很多次看到在各种生产代码库中非常自由地使用扩展方法。

当然,我的经验并不能代表大多数人,但我想知道指南是否有转变,是一种替代的设计理念,还是我碰巧看到足够的代码忽略了指导,让我这么认为?

注意:我不是要引发一场辩论(这会立即导致这个问题的结束) - 老实说,我一直想知道这个问题并感受到我最好的机会答案就在这里。

4 个答案:

答案 0 :(得分:2)

我认为所有这些亮点都是理论与实践之间的通常差异。从理论上讲,我们应该谨慎使用它们,但实际上我们不这样做。从理论上讲,我们应该做很多我们在实践中没有做到的事情,一般而言,不仅仅是编程。

答案 1 :(得分:2)

多态性不适用于扩展方法,因为它们在编译时绑定。

ParentClass parentClass = new ParentClass();
ParentClass derivedClass = new DerivedClass();

如果这两个类都有一个名为ExtensionMethod()的扩展方法(我已经看到了试图模仿虚拟/覆盖方法的扩展方法),这两个调用都会调用父类的扩展方法:

 parentClass.ExtensionMethod();
 derivedClass.ExtensionMethod();

为了实际使用派生的扩展方法,您必须调用:

 ((DerivedClass)derivedClass).ExtensionMethod();

答案 2 :(得分:1)

扩展类是一种很好的方法,但通常它不适用于使用第三方库的代码(与教育/示例代码不同,这是生产代码的常见情况)。因此,如果它有意义,则派生新类,但是当它们使代码更具可读性时,可以随意使用扩展方法。

有很多原因可以解释为什么有很多扩展方法:

  • 通常你不能扩展一个类来添加使你的产品代码更具可读性的方法。即值类型,如String或某些层次结构中的基类,如Stream。
  • 扩展方法是在不污染接口的情况下向接口添加方法的有效方法。 LINQ是如何产生更易读的代码的好例子。
  • 某些框架建议在特定情况下使用扩展方法。即对于MVC,建议为HtmlHelper添加扩展。

答案 3 :(得分:1)

我认为使用扩展方法有利有弊。

优点:可以将扩展方法视为访问者模式(GoF)。因此,它利用了模式,即在不修改代码的情况下,我们可以扩展一些功能。

缺点:尽管有这样的优势,但为什么MSDN谨慎地使用扩展方法,IMO,扩展方法会在某些时候引起问题。首先,如果扩展方法的对象具有与扩展名不同的命名空间,我们应该知道它的位置。这导致有时我们无法使用扩展中的一些重要功能。此外,我看到很多代码都有滥用扩展名。由于扩展基于Type,有时该类型的对象确实不需要扩展,但在编码时,我们应该看到很多扩展方法。


[更新]

IMO,滥用扩展方法

  1. 使用扩展方法的常规类型,如对象:如果有很多具有对象类型的扩展方法,并且该扩展只关注少数类型,它会让我们烦恼,因为每个对象与方法有关。
  2. 与点操作符断开链接或误解:让我举个例子。有如下代码,我们应该按顺序调用Read然后Write方法。但是,我们可以按相反的顺序调用方法。

    public static string Read(this string message)
    {
        //do something
        return message;
    }
    
    public static string Write(this string message)
    {
        //do something
        return message;
    }
    
    public static void Method()
    {
        "message".Read().Write();
        "message".Write().Read(); // this is problem!
    }