当我第一次了解扩展方法时,我读了this:
通常,我们建议您实施扩展方法 谨慎而且只有在你必须的时候。客户端代码 必须通过创建新类型来扩展现有类型 从现有类型派生而来。
但是,我有很多次看到在各种生产代码库中非常自由地使用扩展方法。
当然,我的经验并不能代表大多数人,但我想知道指南是否有转变,是一种替代的设计理念,还是我碰巧看到足够的代码忽略了指导,让我这么认为?
注意:我不是要引发一场辩论(这会立即导致这个问题的结束) - 老实说,我一直想知道这个问题并感受到我最好的机会答案就在这里。
答案 0 :(得分:2)
我认为所有这些亮点都是理论与实践之间的通常差异。从理论上讲,我们应该谨慎使用它们,但实际上我们不这样做。从理论上讲,我们应该做很多我们在实践中没有做到的事情,一般而言,不仅仅是编程。
答案 1 :(得分:2)
多态性不适用于扩展方法,因为它们在编译时绑定。
ParentClass parentClass = new ParentClass();
ParentClass derivedClass = new DerivedClass();
如果这两个类都有一个名为ExtensionMethod()的扩展方法(我已经看到了试图模仿虚拟/覆盖方法的扩展方法),这两个调用都会调用父类的扩展方法:
parentClass.ExtensionMethod();
derivedClass.ExtensionMethod();
为了实际使用派生的扩展方法,您必须调用:
((DerivedClass)derivedClass).ExtensionMethod();
答案 2 :(得分:1)
扩展类是一种很好的方法,但通常它不适用于使用第三方库的代码(与教育/示例代码不同,这是生产代码的常见情况)。因此,如果它有意义,则派生新类,但是当它们使代码更具可读性时,可以随意使用扩展方法。
有很多原因可以解释为什么有很多扩展方法:
答案 3 :(得分:1)
我认为使用扩展方法有利有弊。
优点:可以将扩展方法视为访问者模式(GoF)。因此,它利用了模式,即在不修改代码的情况下,我们可以扩展一些功能。
缺点:尽管有这样的优势,但为什么MSDN谨慎地使用扩展方法,IMO,扩展方法会在某些时候引起问题。首先,如果扩展方法的对象具有与扩展名不同的命名空间,我们应该知道它的位置。这导致有时我们无法使用扩展中的一些重要功能。此外,我看到很多代码都有滥用扩展名。由于扩展基于Type,有时该类型的对象确实不需要扩展,但在编码时,我们应该看到很多扩展方法。
[更新]
IMO,滥用扩展方法
与点操作符断开链接或误解:让我举个例子。有如下代码,我们应该按顺序调用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!
}