【问题标题】:When/Why would I use an extension method in VB.Net?何时/为什么要在 VB.Net 中使用扩展方法?
【发布时间】:2015-09-08 00:42:30
【问题描述】:

我是 VB.Net 的新手,我对扩展方法的用例很好奇。具体来说,当我可以使用继承和接口时,为什么要使用扩展方法?乍一看,扩展方法在我看来并不是一种非常 OO 的做法,与使用子类和/或接口来实现相同目的相比,它们似乎会导致代码可读性降低。我缺少的扩展方法有什么特别之处吗?你什么时候使用它们?

【问题讨论】:

  • 您是在阅读了关于扩展方法的MSDN article 以进一步澄清后提出这个问题吗?
  • 如果您想伪扩展像String 这样的.NET 类,扩展方法很方便。您不能从 String 继承来扩展它。它比 Shared 方法的全局类更好,因为它们出现在智能感知中。
  • @Cory:这是 VB.NET 版本:msdn.microsoft.com/en-us/library/bb384936.aspx
  • 这对大家很有帮助,谢谢。在链接的文章和发布的答案之间,我收集到扩展方法通常用作函数库,以便在向后兼容性或其他因素导致难以实现更多 OO 解决方案时,将新功能“修补”到您自己的代码中,或者当子类化不是一个好选择时,微 API 可以更方便地使用其他人的代码。

标签: vb.net oop inheritance interface extension-methods


【解决方案1】:

你说得对,扩展方法在 OO 工具箱中并不是一个非常重要的工具。因此,您可能不会经常使用它们来扩展您自己代码中的类。

正如您所写的那样,在阅读其他开发人员的代码时,它们可能会导致混淆,因为您只能使用位于您已导入的命名空间中的扩展方法。

尽管如此,如果您想创建扩展您无法更改的类的辅助方法,扩展方法非常方便。那是为其创建的主要用例扩展方法。

【讨论】:

    【解决方案2】:

    在实现扩展方法之前,人们应该始终尝试查看它是否适合标准 OO 类。

    但是,我可以想到两种情况,这些扩展可能非常方便:

    1) 原始类型的扩展:您不想派生原始类型(如 Int 或 Date)只是为了向其添加方法。我什至不确定您是否可以派生原始类型,但即使可以,也不意味着您应该这样做。

    2) 通用对象的扩展:假设您想为一个非常通用的对象编写一些插件功能;假设将 ToJSON 方法添加到 DbDataReader。您可以强制用户使用您派生的 DbDataReader 类型 (CustomDbDataReader),但他们必须在各处更改代码才能使用您的新类。使用扩展将允许他们在本机 DbDataReader 上使用您的新方法。

    您还会注意到 DbDataReader 是一个抽象类。 SqlDataReader 和 OleDbDataReader 都派生自 DbDataReader 类。如果您想编写一个合法的 OO 函数,则必须为 SqlDataReader 编写一个,为 OleDbDataReader 编写另一个,即使该函数的功能完全相同。

    【讨论】:

      猜你喜欢
      • 2011-01-25
      • 2017-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多