C#的扩展方法可以实现对已有的类添加方法的同时,无需创建新的派生类或者修改原来的类。
我们直接看一个例子:
namespace CSharp {
public static class StringExtensions {
public static int WordCount(this string str) {
return str.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries).Length;
}
}
}
namespace CSharp {
class Program {
static void Main(string[] args) {
string str = "i love china";
Console.WriteLine(str.WordCount());
}
}
}
上述例子中,我们扩展了C#的string类,给它添加了一个叫做WordCount的方法。在这里我们无需考虑原来string的内部实现,从而我们可以放心大胆的扩展原来类的功能而不会破坏。
扩展方法必须通过一个静态类的静态方法来实现。
C#中的静态类是这样定义的:
- 它们仅包含静态成员。—-函数成员和变量都必须有static修饰
- 它们不能被实例化。
- 它们是密封的。———–编译器编译时自动生成sealed标记
- 它们不能包含实例构造函数。
虽然静态类不存在实例构造函数,但是仍可以给它指定静态构造函数设置一些初始值,例如:
public static class StaticClass {
static StaticClass() {
//不允许出现public或者private等访问修饰符
Console.WriteLine("In Static Class : Static Ctor");
}
public static void ShowYourType(object obj) {
Console.WriteLine(string.Format("Your type is {0}", obj.GetType()));
}
}
class Program {
static void Main(string[] args) {
string str = "i love china";
int mint = 42;
StaticClass.ShowYourType(str);
StaticClass.ShowYourType(mint);
}
}
最后,程序的输出结果如下:
可以发现,In Static Class : Static Ctor只输出了一次,这是因为,StaticClass仅在第一次调用它的静态方法的时候被“激活”。
话题扯回扩展方法,其实第一个例子就给出了扩展方法的使用方法了,这篇博文给出了很多有趣的扩展方法的例子。