回顾C#3.0新特性(2)

三 扩展方法

让我想起了设计模式中的装饰器(Decorator)

(我将在“C#3.0设计模式”的阅读笔记中描述)。

QQ截图未命名

其实.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 修饰符。

  • 分部方法可以为泛型的。约束将放在定义分部方法声明上,但也可以选择重复放在实现声明上。参数和类型参数名称在实现声明和定义声明中不必相同。

  • 不能将委托转换为分部方法。

特点:

分布类定义后不一定要实现,在编译时会自动移除方法以及对方法的所有调用。

 

原文地址:https://www.cnblogs.com/my36z/p/1406834.html