0
点赞
收藏
分享

微信扫一扫

C# 扩展方法之美


C# 扩展方法

扩展方法可以用新方法扩展现有类型改变原始类型的定义。

扩展方法是静态类的静态方法,其中this修饰符应用于第一个参数。

第一个参数的类型将是扩展的类型。

例如:

public static class StringExtension {
public static bool IsCapitalized (this string s) {
if (string.IsNullOrEmpty(s))
return false;
return char.IsUpper (s[0]);
}
}

IsCapitalized扩展方法可以被调用,就像它是一个字符串上的实例方法,如下所示:

Console.WriteLine ("Javascript".IsCapitalized());

一个扩展方法调用被转换回一个普通的静态方法调用:

Console.WriteLine (StringExtension.IsCapitalized ("Javascript"));

接口也可以扩展:

public static T First<T> (this IEnumerable<T> sequence){
foreach (T element in sequence)
return element;
throw new InvalidOperationException ("No elements!");
}
...
Console.WriteLine ("Javascript".First()); // J


扩展方法与实例方法

任何兼容的实例方法优先于扩展方法。

在以下示例中,Main的MyMethod方法将始终优先 - 即使在使用int类型的参数x调用时:

class Main {
public void MyMethod (object x) { }
}

static class Extensions {
public static void MyMethod (this Main t, int x) { }
}

在这种情况下调用扩展方法的唯一方法是通过正常的静态语法:

Extensions.MyMethod(...)


扩展方法与扩展方法

如果两个扩展方法具有相同的签名,则扩展方法必须作为普通静态方法调用,以消除调用方法的歧义。

如果一个扩展方法具有更多特定的参数,则更具体的方法优先。

以下代码显示了如何使用它:

static class StringExtension {
public static bool IsCapitalized (this string s) {...}
}
static class ObjectHelper {
public static bool IsCapitalized (this object s) {...}
}

以下代码调用StringExtension的IsCapitalized方法:

bool test1 = "Javascript".IsCapitalized();

要调用ObjectHelper的IsCapitalized方法,我们必须明确指定:

bool test2 = (ObjectHelper.IsCapitalized ("Javascript"));

类和结构被认为比接口更具体。


举报

相关推荐

0 条评论