c#中有扩展方法和分部方法。
扩展方法可以对一个已经存在的类型(class)中的功能进行添加,而不用对已有类进行修改或者派生【派生的方式对于值类型或者sealed修饰的类型来说行不通】
在语法上: 扩展方法 要求所在的类型必须是一个静态类,并且扩展方法也是静态的【static修饰】,扩展方法只能用来对方法进行扩展,而不能扩展属性【property】,事件,委托等。扩展方法的第一个参数是要进行扩展的类型,并且有this关键字修饰。
格式大致如下:
static class StringExtention{
public static int IndexOf(this String s,char c){
...
}
}
需要注意的是: 对一个类型进行了扩展,它的派生类也将会可以使用这些扩展方法。
多个静态类可以定义相同的扩展方法。
扩展方法至少需要有一个参数,并且有this进行标识。
同时扩展方法不能用于具有泛型的静态类型中。
ps:编译器在看到有个this标识的参数时,会给这个方法,类型,程序集加上ExtentionAttribute特性。来加快对扩展方法的“搜索”【智能感知】【System.Core.dll中 ExtentionAttribute】
分部方法:
分部方法要求,所在的类型有partial标识,同时分部方法也有partial进行标识。CLR其实是不知道所谓的分部方法的,都是编译器在做。
通过使用分部方法,可以将一个类型中的操作分散在多个文件中,方便开发。
一般格式:
//t1.cs
partial class T{
partial void func();
public int tt(){
...
func();
}
}
//t2.cs
partial class T{
partial void func(){
...
}
}
需要注意的是: 分部方法的返回值必须是void,因为如果编译器没有找到分部方法 的实现部分【如果有返回值,那么就会出错】,同时,分部方法的参数不能有out修饰【不能是出参数】,道理也是同上。
分部方法前面不能有private等访问控制修饰符,所有的分部方法其实就是private的。分部方法的实现部分和声明部分应当严格的保持一致。
分部方法较为灵活,如果在没有分部方法存在时候,可能就需要使用virtual虚函数机制来进行,供派生类进行处理。因此对于sealed修饰的类显然就无法进行。同时,使用virtual机制,不管是否有派生类实现,那么这次调用还是会发生。而使用分部方法,如果没有找到分部方法的实现部分,那么就会省去对其的调用。