三 扩展方法
让我想起了设计模式中的装饰器(Decorator)
(我将在“C#3.0设计模式”的阅读笔记中描述)。
其实.net内部很多方法已经是扩展方法了。看图标,普通的方法图标下带一个箭号的。上图就是LINQ的截图。
扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。
下面向string扩展了一个方法(扩展方法可以写在不同的命名空间)
namespace ExtensionMethods
{
public static class MyExtensions
{
public static int WordCount(this String str)
{
return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length;
}
}
}
扩展方法必须是静态类中的静态方法。需要扩展的属性作为参数放入规则同上,加了一个this.
调用。(如果不在同一个命名空间要记得引用一下)
string s = "Hello Extension Methods";
int i = s.WordCount();
如果扩展方法和原类方法冲突则优先绑定原类方法
四 分部类和方法
可以将类或结构、接口或方法的定义拆分到两个或多个源文件中。每个源文件包含类型或方法定义的一部分,编译应用程序时将把所有部分组合起来。
关键字是 partial
其实早在 vs2003 升级到 vs2005 大家就体验过了。在原先的vs2003里面窗体的代码全在一个.cs里面。所以一些控件的定义、设置和自己写的代码都在一个文件里面。vs2005刚开始用的时候还挺不习惯的,控件的定义都找不到了。原来放在了另一个文件里 Designer.cs。其实这就是分布类 partial。
分布方法应该是在C#3.0才开始支持的。
-
分部方法声明必须以上下文关键字 partial 开头,并且方法必须返回 void。
-
分部方法可以有 ref 参数,但不能有 out 参数。
-
分部方法为隐式 private 方法,因此不能为 virtual 方法。
-
分部方法不能为 extern 方法,因为主体的存在确定了方法是在定义还是在实现。
-
分部方法可以有 static 和 unsafe 修饰符。
-
分部方法可以为泛型的。约束将放在定义分部方法声明上,但也可以选择重复放在实现声明上。参数和类型参数名称在实现声明和定义声明中不必相同。
-
不能将委托转换为分部方法。
特点:
分布类定义后不一定要实现,在编译时会自动移除方法以及对方法的所有调用。