C# Language扩展方法


句法

  • public static ReturnType MyExtensionMethod(此TargetType目标)
  • public static ReturnType MyExtensionMethod(此TargetType目标,TArg1 arg1,...)

参数

参数细节
这个扩展方法的第一个参数应始终以this关键字开头,后跟标识符,用于引用要扩展的对象的“当前”实例

备注

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

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

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

哪个名称空间

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

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

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

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

这并不总是一个好主意。例如,在一个特定情况下,您可能希望扩展一个公共类型(例如, bool IsApproxEqualTo(this double value, double other) ),但不要“污染”整个System 。在这种情况下,最好选择一个本地的,特定的命名空间。

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

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

适用性

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

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

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

扩展方法 相关例子