您的位置:首页 > 编程语言 > C#

C#2.0的新特性

2011-09-13 16:00 260 查看
************************************************************** 

 

 

 

C#2.0的新特性
前一段时间写Resume,写自己熟悉.Net 2.0。然后想到如果别人问C#2.0有些什么新特性,我应该怎么回答呢?发觉原来除了泛型(Generic)外自己也说不出什么。于是翻书查资料重新整理了思路。重新审视C#2.0的新特性,当作学习3.0的起步吧。
一、泛型(Generic) MS:http://msdn.microsoft.com/zh-cn/library/bb384067.aspx

概述:

引入泛型绝对是C#2.0的最大的新特性。通过“参数化类型”实现一份代码操作多种数据类型。泛型的优点是更好的类型安全;更好的复用;更高的效率和更清晰的约束。但说实在,除了一些通用的数据结构,集合类和通用算法外,使用到泛型的地方还不多。而且System.Collections.Generic中的类也很够用了。基本没写过自己的泛型类。

语法点:

语法方面主要是使用在类型名称后面加入“<T>”来传入类型参数。涉及泛型类型继承的一条规则是“封闭类(所有类型都已确定)不能继承开放类(含有未确定类型)”。同时可以使用where来添加对作为参数的类型的约束。具体有四种:基类约束、接口约束、构造器约束和值/引用类型约束。最后特别提醒,delegate也是一种类型,别忘了泛型委托。

二、泛型方法(Generic Method)
概述:

泛型方法即在方法声明中包含类型参数。其实属泛型的内容。但泛型方法可以用在一般类中。

语法点:

重载(overload)的时候注意,约束不成为方法签名的一部分。而重写(override),约束是会被默认继承的。

三、匿名方法(Anonymous Method)

概述:可以直接将代码赋给委托。在进行委托实例化时可以省略掉委托类型。代码示例如下:

myButton.Click += delegate {//代码}

myButton.Click += myClick;

感觉就是一种语法的简化。从代码的可维护性来说还是不用为好。但又确实能使一些代码简洁一点。看团队的决定吧。 

语法点:

要注意外部变量的生存周期会一直延长到委托实例引用结束。尽量避免使用。

四、迭代器(Iterator)

概述:

严格来说只是简化迭代器的构造罢了。或者说简化了创建可以用于foreach的枚举集合的工作。通过引入关键字yield来实现。再不用太多的关心IEnumerator了。直接在类中实现GetEnumerator()然后在for循环中用yield return就可以了。

语法点:

可以用yield break来停止迭代。

五、局部类(Partial Class)

概述:

就是允许通过关键字partial将一个类写在多个cs文件中。最大的用处可能就是将IDE自动生成的代码分开吧。大家都留意到VS05中的自动生成的代码都到designer.cs中去了吧。

语法点:

在不同部分定义中,Attribute和Interface是累加的。当然要保证基类的唯一。而abstract和sealed是部分使用,整个类生效。语义类型访问修饰符要保持一致。

六、可空类型(Nullable Type)
概述:

其实是一个泛型类型。System.Nullable<T>,T必须为值类型。并且通过“?”来作一个语法的简化。用一句代码说明就是:

int? x = null;

引入NullableType获得的启示是,.Net的ORMapping可以做得更好了。

语法点:

使用HasValue属性判断是否为null。

七、静态类(Static Class)

概述:

可以声明一个static class。该class不能被继承不能被实例化,只能包含静态成员。相当于sealed abstract。用途可以用作全局函数。另外Singleton模式的实现更方便了。

语法点:

不能有constructor,不能有实例成员,不能再使用sealed abstract修饰。不能继承其他类和实现任何interface。成员不能使用protected修饰符。

八、属性访器访问修饰符

概述:

可以额外对get、set中的其中一个属性访问其使用一个访问修饰符。用途可以说是更灵活的封装吧。

语法点:

只能在get、set的一个中使用。接口中的属性访问器不能同样不能带有访问修饰符。索引器可以使用。

九、命名空间别名限定符

概述:可以使用双冒号“::”使用一个命名空间的别名。如

using sc=System.Collection;

那么使用的时候就可以写成sc::ArrayList()了。

作用是更方便的调用不同命名空间下的同名类性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息