10.11 扩展方法
当我们需要对已有的类添加新的功能时,当然可以选择从已有的类继承,然后在派生类中加入新的方法,我们还有另外一个选择,那就是使用扩展方法,扩展方法是这样一种方法:
❑扩展方法是一种特殊的静态方法,它必须定义于静态类中;
❑扩展方法的第一个参数以this修饰符为前缀,后跟要扩展的目标类型及其形参;
❑扩展方法所在的类必须在使用它的类可见范围内,否则需使用using指令将命名空间显式导入到当前源代码中;
❑扩展方法只能针对实例调用,也就是说,目标类不能为静态类;
❑如果扩展方法和被扩展类中某个方法签名相同,则扩展方法永远都不会被调用;
❑其他命名空间下的扩展方法的优先级低于当前命名空间下的扩展方法的优先级,优先级最高为实例方法。
通过扩展方法,我们就可以在实现不修改类型的情况下,对一个类型进行功能上的扩展,而且新的扩展方法可以在其他类的对象上像调用实例方法那样进行调用。
下面,我们看一个示例,我们为string类型添加了计算英文单词数的方法:WordCount(),使得为string类型扩展功能比较容易,并且让计算一个字符串值中的英文单词数更加直观,如代码清单10-14所示。
代码清单10-14 扩展方法
1 using System;
2
3 namespace ProgrammingCSharp4
4{
5 public static class MyExt
6{
7///<summary>
8///扩展方法,增加计算一个字符串中包含单词数的功能
9///</summary>
10 public static int WordCount(this string str)
11{
12 return str.Split(new char[]{'','.','?'},
StringSplitOptions.RemoveEmptyEntries).Length;
13}
14
15///<summary>
16///此扩展方法不会被执行,因为它和string类型的ToString方法签名相同
17///</summary>
18 public static string ToString(this string str)
19{
20 return"My ToString()";
21}
22}
23
24 class ClassExample
25{
26 public static void Main()
27{
28//声明一个string类型的变量word,并初始化
29 string word="The quick brown fox jumps over a lazy dog.";
30//应该输出单词数:9
31 Console.WriteLine(word.WordCount());
32//注意观察此处的输出
33 Console.WriteLine(word.ToString());
34}
35}
36}
上述代码的运行结果为:
9
The quick brown fox jumps over a lazy dog.
对代码清单10-14的说明如表10-7所示。