扩展方法
扩展方法是语法糖,允许在对象实例上调用静态方法,就好像它们是类型本身的成员一样。
扩展方法需要显式目标对象。你需要使用 this
关键字从扩展类型本身访问该方法。
扩展方法必须声明为静态,并且必须存在于静态类中。
哪个名称空间
为扩展方法类选择命名空间是可见性和可发现性之间的权衡。
最常提到的选项是为扩展方法设置自定义命名空间。但是,这将涉及通信工作,以便你的代码用户知道扩展方法存在,以及在哪里找到它们。
另一种方法是选择一个名称空间,以便开发人员通过 Intellisense 发现你的扩展方法。因此,如果要扩展 Foo
类,将扩展方法放在与 Foo
相同的命名空间中是合乎逻辑的。
重要的是要意识到没有什么可以阻止你使用别人的命名空间 :因此,如果你想扩展 IEnumerable
,你可以在 System.Linq
命名空间中添加你的扩展方法。
这并不总是一个好主意。例如,在一个特定的情况下,你可能想要扩展一个普通类型(例如 bool IsApproxEqualTo(this double value, double other)
),但是没有那个’污染’整个 System
。在这种情况下,最好选择一个本地的,特定的命名空间。
最后,还可以将扩展方法放在没有命名空间的位置 !
一个很好的参考问题: 如何管理扩展方法的命名空间?
适用性
在创建扩展方法时应小心谨慎,以确保它们适用于所有可能的输入,并且不仅与特定情况相关。例如,可以扩展系统类,例如 string
,它使你的新代码可用于任何字符串。如果你的代码需要在特定于域的字符串格式上执行特定于域的逻辑,则扩展方法将不合适,因为它的存在会使使用系统中其他字符串的调用者感到困惑。
以下列表包含扩展方法的基本功能和属性
- 它必须是静态方法。
- 它必须位于静态类中。
- 它使用
this
关键字作为 .NET 中类型的第一个参数,此方法将由客户端的给定类型实例调用。 - 它还通过 VS intellisense 显示。当我们在类型实例之后按下 dot
.
时,它会进入 VS intellisense。 - 扩展方法应该与使用的名称空间相同,或者你需要通过 using 语句导入类的名称空间。
- 你可以为具有扩展方法的类指定任何名称,但该类应该是静态的。
- 如果要向类型添加新方法并且没有它的源代码,那么解决方案是使用并实现该类型的扩展方法。
- 如果你创建的扩展方法与你要扩展的类型具有相同的签名方法,则永远不会调用扩展方法。