扩展方法和静态方法有什么区别?

Ard*_*oli 6 .net c# extension-methods static-methods

扩展方法和静态方法有什么区别?

我有两个这样的课程:

public static class AClass {
    public static int AMethod(string ....)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

public static class BClass {
    public static int BMethod(this string ....)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以使用这些

AClass.AMethod('...');
Run Code Online (Sandbox Code Playgroud)

要么

'...'.BMethod();
Run Code Online (Sandbox Code Playgroud)

提出哪个?

Ree*_*sey 29

扩展方法仍然是一种静态方法.您可以完全按照常规静态方法使用它.

唯一的区别是扩展方法允许您以类似于它的一部分的方式使用该方法,因此您可以编写:

int result = stringValue.BMethod();
Run Code Online (Sandbox Code Playgroud)

代替:

int result = BClass.BMethod(stringValue);
Run Code Online (Sandbox Code Playgroud)

这纯粹作为编译"技巧" - 编译器看到第一个表单,如果它BClass是可用的(它有一个正确的using并且在引用的程序集中),那么它将把它变成第二个方法的IL.这纯粹是一种便利.

提出哪个?

这真的取决于.如果您控制类型,我建议将方法放在类型本身上.这通常更易于维护.

如果你不控制类型,或者你试图"扩展"一个普通类型(例如IEnumerable<T>),那么扩展方法可能是一种合理的方法.

但是,如果类型是一种非常常见的类型,我通常会避免使用扩展方法,因为它们在智能感知中会变成"噪音",这反过来会导致额外的混淆.举例来说,我个人不建议增加对扩展方法System.ObjectSystem.String

  • 很好地说(一如既往),里德.+1 (2认同)