2013-10-02 121 views
6

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

我有两个类是这样的:

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

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

我可以用这些像

AClass.AMethod('...'); 

'...'.BMethod(); 

哪个建议?

回答

27

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

唯一的区别是,一个扩展方法可以让你使用的方法中,看起来像它的零件种类的方式,所以你可以写:

int result = stringValue.BMethod(); 

相反的:

int result = BClass.BMethod(stringValue); 

这个工作纯粹是作为一个编译“技巧” - 编译器会看到第一个表单,并且如果BClass可用(它有一个合适的using并位于引用程序集中),那么它会将其转换为第二个方法的IL您。这纯粹是一种方便。

哪个建议?

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

如果您不控制类型,或者您试图“扩展”普通类型(如IEnumerable<T>),那么扩展方法可能是一种合理的方法。但是,如果类型是一种非常常见的类型,我通常会避免使用扩展方法,因为它们在智能感知中变成了“噪音”,这反过来会造成额外的混淆。例如,我个人不建议在System.ObjectSystem.String等上添加扩展方法。

+2

非常好(一如既往),里德。 +1 – Brian

1

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

当然还有一些限制: 扩展方法必须作为静态方法和静态类(在非嵌套的非泛型静态类中更加精确)实现。 您可以使用扩展方法来扩展类或接口,但不能覆盖它们。与接口或类方法具有相同名称和签名的扩展方法永远不会被调用。在编译时,扩展方法总是比类型本身定义的实例方法具有更低的优先级。 扩展方法无法访问它们正在扩展的类型中的私有变量。 您可以将扩展方法视为一种“合法”方式,以将更多静态方法添加到现有类中,而无需实际继承它们。 但有趣的是,与类的常规静态方法不同,您无法在类级别上调用扩展方法(如果您尝试此操作,将得到编译时错误),而是必须在类的实例上调用它们(就好像它们是该类实例的一些常规方法,它们不是!!!)。

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

相关问题