C#3.0都已经吵得沸沸扬扬了,很多人还没开始研究C#2.0,源于CSDN上一个热贴的讨论,我决定对C#2.0的主要新特性做一个入门级别的简单介绍:
其实语言的改进主要是为了在编译器允许的情况下切合人的思考方式并减少工作量。
我在实际项目中用过的C#2.0语言扩展主要是匿名方法,泛型,不完全类型,和改进的迭代器:
1、关于匿名方法:
以前所有的事件响应都是分成两部分,先定义一个委托然后绑定到事件处理函数。我们经常看到类似下面的代码:
this.button1.Click += new System.EventHandler(this.button1_Click);
................
................
private void button1_Click(object sender, System.EventArgs e)
{
MessageBox.Show("您点击了一个按钮");
}
在C#2.0中,可以直接在原来定义委托的地方直接编写以一个delegate关键字开头的匿名方法,用如下代码即可实现同样功能:
button1.Click+=delegate{MessageBox.Show("您点击了一个按钮");};
如果这个匿名方法的委托类型编译器认不出来,可以用强制类型转换,如:
Delegate delebutton1click=(EventHandler)delegate{MessageBox.Show("您点击了一个按钮");};
匿名方法还可以捕获或引用其它方法的参数、局部变量、属性等,代码量明显减少,套句广告词就是“简单方便又实惠”。
2.泛型:
以前通用的数据结构只能用object类型来存贮各种类型的数据。在C#2.0里通过某个类型建立的Stack<T>的实例,可以接受各种类型的数据,类型参数T就像个占位符,直到使用时才指定一个实际的类型。
关于泛型大家可以参见速马在上海.Net俱乐部活动上讲泛型用过的ppt
明了易懂。个人觉得泛型是C#2.0带给我们最重要的语言扩展。
3.不完全类型(有的人翻译成不完整类型):
不完全类型可以使一个类在类型修饰符partial修饰下在不同部分实现。如:
我们以前实现类时用的
public class Class1
{
...........(这是一段语句)
,,,,,,,,,,,(另一段语句)
}
在C#2.0里我们可以通过
public partial class Class1
{
...........
}
public partial class Class1
{
,,,,,,,,,,,
}
来实现,甚至这几个部分可以在不同的源文件中。要注意的是不完全类型的所有部分要一块儿编译,同时,不完全类型不允许对已经被编译的类型进行扩展。团队开发的时候,不完全类型很有用。
4.迭代器
C#的foreach语句是VB那里学来的,被用于迭代一个可枚举集合的所有元素。为了可以被枚举,集合必须具有一个无参数GetEnumerator()方法,它返回一个枚举器。一般情况下,枚举器实现麻烦。在C#1.x里对于值类型集合在foreach时,每个值都经历装箱和拆箱操作,引用类型集合在foreach时也有个多余的castclass指令来保证枚举出来的值进行类型转换时不发生错误。但这个问题在C#2.0中使用迭代器就方便多了。比如原来C#1.x中的下列语句
using System.Collections;
public class Tokens : IEnumerable
{
...
Tokens f = new Tokens(...);
foreach (string item in f)
{
Console.WriteLine(item);
}
...
}
C#2.0中提供了强类型的泛型IEnumerable定义,所以可以写成
namespace System.Collections.Generic
{
public interface IEnumerable<ItemType>
{
IEnumerator<ItemType> GetEnumerator();
}
public interface IEnumerator<ItemType> : IDisposable
{
ItemType Current{get;}
bool MoveNext();
}
}
这样就既能保证遍历集合时的类型转换是安全无误的,同时又能避免冗余转换,使效率提高。
5.C#2.0还有其它的一些新特性,如新增了static class,我的理解就相当于以前有人想定义的abstract sealed class,只不过规定好static这个关键字不会引起歧义。等等。欢迎大家补充。