9

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

我有两个这样的课程:

public static class AClass {
    public static int AMethod(string ....)
    {
    }
}

public static class BClass {
    public static int BMethod(this string ....)
    {
    }
}

我可以像这样使用这些

AClass.AMethod('...');

或者

'...'.BMethod();

哪个是提议的?

4

2 回答 2

35

扩展方法仍然是静态方法。您可以像使用普通静态方法一样使用它。

唯一的区别是扩展方法允许您以看起来像是类型的一部分的方式使用该方法,因此您可以编写:

int result = stringValue.BMethod();

代替:

int result = BClass.BMethod(stringValue);

这纯粹是作为一个编译“技巧”工作——编译器看到第一种形式,如果它BClass是可用的(它有一个正确的using并且在一个引用的程序集中),那么它将为你把它变成第二种方法的 IL。这纯粹是一种方便。

哪个是提议的?

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

如果您不控制类型,或者您试图“扩展”一个通用类型(例如IEnumerable<T>),那么扩展方法可能是一种合理的方法。

但是,如果该类型是一种非常常见的类型,我通常会避免使用扩展方法,因为它们在智能感知中会变成“噪音”,这反过来又会导致额外的混乱。例如,我个人不建议在System.ObjectorSystem.String等​​上添加扩展方法。

于 2013-10-02T16:42:05.057 回答
2

您不能覆盖扩展方法。只有当方法具有不同的签名时,它才能被重载。

当然有一些限制:扩展方法必须作为静态方法和静态类实现(更准确地说是在非嵌套、非泛型静态类中)。您可以使用扩展方法来扩展类或接口,但不能覆盖它们。永远不会调用与接口或类方法具有相同名称和签名的扩展方法。在编译时,扩展方法的优先级总是低于类型本身定义的实例方法。扩展方法不能访问它们扩展类型的私有变量。您可以将扩展方法视为向现有类添加更多静态方法而不实际继承它们的“合法”方式。但有趣的是,与类的常规静态方法不同,

此外,在扩展方法中,您可以自由地使用正在调用该方法的传递对象实例的公共属性,您绝不仅限于静态对象数据。只有扩展方法是静态方法,但调用的对象是完整的、常规的对象实例。

于 2013-10-20T18:41:35.923 回答