扩展方法与静态实用程序类

我正在寻找一些优点和缺点,以便在C#应用程序中使用静态工具类的扩展方法。

例如,扩展方法列中的加号是通过类名调用而非类似“StringUtils”的方便。 但是,con会是它可以模糊框架内部和非框架之间的界限。


我想说的是,一个专业人士会模糊框架和非框架之间的界限:您可以自己使用自己的代码作为框架代码,使用框架类型。

扩展方法当然不应该被任意使用 - 它不像所有的静态方法都应该成为扩展方法。

我试图将其看作是该方法是否在逻辑上“运行”其第一个参数。 如果你能够将它作为一个实例方法包含在内,它会作为实例方法吗?

您可能不知道的“con”:如果扩展类型后来添加了一个适用于相同参数的同名实例方法,则您的调用代码将在您下次重新编译时透明地开始调用该实例方法。 例如, Stream在.NET 4中获得了CopyTo ...我之前编写了一个CopyTo扩展方法,该方法不会被调用。 没有警告说这种情况正在发生,所以你必须警惕。

一个警告:扩展方法还没有足够长的时间,以便最佳实践真正成立。 你应该仔细衡量所有的意见(甚至 - 或者特别是 - 我自己的意见)。


在一天结束时,两种方法都使用静态方法。 唯一的区别

string foo = "bob";
StringUtils.DoSomething(foo);

string foo = "bob";
foo.DoSomething();

是句法糖。 它归结为个人偏好和编码标准。 有时候方法名称可能足够描述,不能保证看到静态类名。 其他时候包含类名更有意义。

最后,扩展方法也可以作为静态方法调用!

string foo = "bob";
StringExtensions.DoSomething(foo);

以上使用与第二个示例中相同的代码,但调用方式不同。 考虑到最后一点,您可以真正创建静态实用程序类作为扩展方法,然后根据需要调用它们。


我个人喜欢通过扩展方法提供的readabilty和chain调用(隐式提供可读性)。

 1) Readability:  
     bool empty = String.IsNullOrEmpty (myString)
     //in comparison to
     bool empty = myString.IsNullOrEmpty ();

 2) Chain calls:  
    var query = Enumerable.Range(0, 10)
                         .Where(x => x % 2 == 0)
                         .Reverse();
    //instead of
    var query = Enumerable.Reverse(Enumerable.Where(Enumerable.Range(0, 10), x => x % 2 == 0));

Con是你的扩展方法,如果你不小心做到了,它可以被实例成员覆盖。 我个人不喜欢这个。 至少编译器应该发出尖叫声,如果它发生在同一个程序集中。

链接地址: http://www.djcxy.com/p/2871.html

上一篇: Extension Methods vs Static Utility Class

下一篇: jQuery multiple events to trigger the same function