扩展方法

扩展方法是语法糖,允许在对象实例上调用静态方法,就好像它们是类型本身的成员一样。

扩展方法需要显式目标对象。你需要使用 this 关键字从扩展类型本身访问该方法。

扩展方法必须声明为静态,并且必须存在于静态类中。

哪个名称空间

为扩展方法类选择命名空间是可见性和可发现性之间的权衡。

最常提到的选项是为扩展方法设置自定义命名空间。但是,这将涉及通信工作,以便你的代码用户知道扩展方法存在,以及在哪里找到它们。

另一种方法是选择一个名称空间,以便开发人员通过 Intellisense 发现你的扩展方法。因此,如果要扩展 Foo 类,将扩展方法放在与 Foo 相同的命名空间中是合乎逻辑的。

重要的是要意识到没有什么可以阻止你使用别人的命名空间 :因此,如果你想扩展 IEnumerable,你可以在 System.Linq 命名空间中添加你的扩展方法。

这并不总是一个好主意。例如,在一个特定的情况下,你可能想要扩展一个普通类型(例如 bool IsApproxEqualTo(this double value, double other)),但是没有那个’污染’整个 System。在这种情况下,最好选择一个本地的,特定的命名空间。

最后,还可以将扩展方法放在没有命名空间的位置

一个很好的参考问题: 如何管理扩展方法的命名空间?

适用性

在创建扩展方法时应小心谨慎,以确保它们适用于所有可能的输入,并且不仅与特定情况相关。例如,可以扩展系统类,例如 string,它使你的新代码可用于任何字符串。如果你的代码需要在特定于域的字符串格式上执行特定于域的逻辑,则扩展方法将不合适,因为它的存在会使使用系统中其他字符串的调用者感到困惑。

以下列表包含扩展方法的基本功能和属性

  1. 它必须是静态方法。
  2. 它必须位于静态类中。
  3. 它使用 this 关键字作为 .NET 中类型的第一个参数,此方法将由客户端的给定类型实例调用。
  4. 它还通过 VS intellisense 显示。当我们在类型实例之后按下 dot . 时,它会进入 VS intellisense。
  5. 扩展方法应该与使用的名称空间相同,或者你需要通过 using 语句导入类的名称空间。
  6. 你可以为具有扩展方法的类指定任何名称,但该类应该是静态的。
  7. 如果要向类型添加新方法并且没有它的源代码,那么解决方案是使用并实现该类型的扩展方法。
  8. 如果你创建的扩展方法与你要扩展的类型具有相同的签名方法,则永远不会调用扩展方法。