【问题标题】:Extension Methods vs Static Utility Class [closed]扩展方法与静态实用程序类 [关闭]
【发布时间】:2011-06-06 11:44:41
【问题描述】:

我正在寻找在 C# 应用程序中使用扩展方法而不是静态实用程序类的一些优点和缺点。

例如,扩展方法列中的一个优点是通过类名而不是“StringUtils”之类的名称来调用更方便。但缺点是它会模糊框架中的内容和框架之外的内容之间的界限。

【问题讨论】:

标签: c# .net design-patterns extension-methods


【解决方案1】:

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

 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 是您的扩展方法,如果您不小心这样做,可以被实例成员覆盖。我个人不喜欢这个。如果它发生在同一个程序集中,至少编译器应该尖叫。

【讨论】:

    【解决方案2】:

    归根结底,这两种方法都使用静态方法。唯一的区别

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

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

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

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

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

    上面使用与第二个示例相同的代码,但调用方式不同。记住这最后一点,你真的可以创建静态实用程序类作为扩展方法,然后按照你的意愿调用它们。

    【讨论】:

    • 附带说明:语法不是唯一的区别。扩展方法不使用隐式转换,静态方法使用。 IE。 long myLong; IntExtension.DoSomething(myLong) 工作正常,但 myLong.DoSomething() 无法编译。这是扩展方法的预期行为,但与常规静态方法不同。
    【解决方案3】:

    我会说 pro 是它模糊了框架中的内容和框架之外的内容之间的界限:您可以像使用框架代码一样自然地使用自己的代码,对框架类型进行操作.

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

    我尝试将其视为该方法是否在逻辑上“在”其第一个参数上运行。如果您能够将其作为实例方法包含在内,作为实例方法是否有意义?

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

    需要注意的是:扩展方法出现的时间还不够长,无法真正确立最佳实践。您应该仔细权衡所有意见(甚至 - 或者特别是 - 我自己的意见)。

    【讨论】:

    • 7 年后,是否已经建立了最佳实践?
    • @Sipo: 不是真的:)
    • @JonSkeet 你对枚举的扩展方法有什么看法?
    • @Fred:如果有用,就去吧。
    猜你喜欢
    • 2015-08-12
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 2012-11-22
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    相关资源
    最近更新 更多