忙了好几天,终于又找到了一点空闲的时间来继续我们体验历程,今天我们要一起体验的是Visual C# 2005 Express Edition Beta。
可以说,打开VC#的界面,没有给我带来什么惊奇的感觉,但清新明快的启动页面还是吸引了我的目光。正如图所示,启动页上提供了一些对于体验者来说很实用的链接,其中有一项“Create a Screen Saver with the C# Starter Kit”恐怕能吸引很多像我这样的菜鸟级玩家,我们就从它开始!
按照提示,我们通过File>New>Project新建一个Screen Saver的项目,熟悉Visual Studio .NET 2003的朋友可能会很惊呀的发现新建项目时居然没有要求指定保存的路径。是的,在VC#2005中,采取了类似于Delphi、VB6的模式,只有在你要求保存项目时它才会让你指定路径,这样,对于我这样喜欢写写小测试程序的人来说是很方便的,不用担心在硬盘上留下越来越多的小垃圾项目。
好了,可以运行一下试试了,VC#2005已经为我们创建了一个可以运行的屏幕保护程序,这个程序还具有RSS新闻阅读的功能呢!程序默认的RSS地址是存放在app.config中的,您可以把它换成自己的Blog的地址试一下:)
从默认生成的项目中,我们可以看到,与VS2003相比,向导生成的代码把static void Main()从窗体类中独立了出来放到了一个名为Program的类中,这样结构对于刚上手的朋友来说可以说是更清晰了。除此之类,我们也已经可以从向导生成的代码中看到一些C#2.0的新特性。现在网上介绍C#2.0的文章已经相当的多,我在这里就不对它作全面的介绍,就看到多少说多少了。
先看生成的几个窗体的文件,VS2003中,通常一个窗体有两个文件组成.cs为代码,.resx为资源,在VC#2005中,通过运用C#2.0的Partial Class特性,把原来的.cs代码文件拆分成两个.cs文件,一个负责窗体界面构造代码的实现,一个负责其它代码的实现。所谓Partial Class特性,其实就是把一个类的的代码可以拆分写到两个.cs文件中,为实现这一特性,您仅仅需要在您想折分的类前加上partial关键字就可以了。这一小小改进实际上是有不少好处的,比如:用它就可以在窗体程序设计时实现了类似于ASP.NET的Code Behind技术。在多的个开发人员同时对一个类进行开发时,在Source Control方面也可以体现出优势:每个开发人员可以Check Out类的不同部分进行分别的同步的开发而不用担心与人它冲突。如果一个类的不同部分之间产生了冲突矛盾怎么办?一个类的元素可以有积累性和非积累性的两种,所谓积累性的,就是可以把多个部分组合起来的,比如实现的Interface,属性,方法,字段等等,非积累性的就是不可组合的元素,如可见性、基类等,要求类的每个部分对这些非积累性元素都作出一致的定义,当一个类的不同部分作出了不同的定义的时候,编译器将报错。
C#2.0另一个重要的特性就是匿名方法,很多时候,我们仅仅是为了使用一个委托,就不得不创建一个方法。比如说,我们在窗体上画个Button,双击一下,就生成了它的事件响应方法,VS其实做了不少事情,首先它得为Button.Click这个事件加一个委托:
this.button1.Click += new System.EventHandler(this.button1_Click);
然后生成相应的方法:
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("Test");
}
当然这只是个例子,就像您现在看到的那样,这个方法也许只有几行代码,但委托还常常用于回调、异步调用、多线程等,这样的东东多了代码就会显得很拖沓。所以通过匿名方法的特性我们可以把上面的两部分代码组合起来,写成:
this.button1.Click += new System.EventHandler( delegate(object sender, EventArgs e)
{
MessageBox.Show("Test");
}
);
C#2.0的新特性先说这么多,VC#2005主菜单条上的一个单词——Refactor——也许很吸引人的目光,VC#2005首先在VS家族中引入了代码重构的功能,正像您看到的,它实现了Extract Method、Rename、Encapsulate Field等几个重构的模式。记得在南京的DevDays2004大会上,讲解者为了演示这个功能郁闷的试了很多次,但当时的Whidbey技术预览版就是不给面子,始终不愿意展示出它强大的功能。还好在这个Express Beta 1上,这个功能已经可以正常的使用了,以Encapsulate Field为例举个简单的例子吧:
public class Test
{
public int i;
public void f()
{
i = 3;
}
}
通过在i上右击选Encapsulate Field,就得到了:
public class Test
{
private int i;
public int I
{
get
{
return i;
}
set
{
i = value;
}
}
public int f()
{
I = 3;
}
}
它可以自动把public的成员重构为private成员并公开public的属性,并且更新所有对Test.i的引用,把它们改成对Test.I属性的使用。
说到属性,可以一提的是C#2.0中引入了属性和索引的可见性,比如,可以这样:
public class Test
{
private int i;
public int I
{
get
{
return i;
}
protected set
{
i = value;
}
}
}
这就表示了I这个属性具的get具有public的访问级别,而set则只有protected的访问级,当然,用在set和get上可见性范围是不能超过属性本身的可见性的,你不能让一个属性具有private级别而它的get却有public的访问级。
不小心又回到C#2.0的新特性了,继续来看VC#2005的特性,除了重构,VC#2005在原本已经很好用代码编辑器上又下了功夫,从图中您可以看到,它对代码实现了智能标签的功能,可以帮助程序员更好的修改代码。对于正在编辑的代码,左侧可以显示出编辑的状态,修改过存过盘的代码会标上绿线,修改过未存过盘的地方会标上黄线,此外,新的括号匹配也跟Eclipse中一样好看好用了。IntelliSense中也增加了自动跟据调用生成函数原型的Generate Method Stud功能(感觉用它实施TDD真是太好了)和插入代码片段、Surround With等功能。和VC++2005一样,VC#2005同样也增加了自动查看鼠标当前位置的符号定义的功能,同样通过称之为Code Definition View的窗口来显示。Windows Forms窗体设计器也同前面介绍的VC++2005中一样做了相应的改进,这些改进的特性都给程序员带来了很大的方便。
准备收笔了却发现我忘记介绍了C#2.0中的一个最为重要的新特性:泛型。其实真得不是忘了,而是我对它的了解还相当的少,建议感兴趣的朋友先去看看大师们的文章吧,我会在后面的文章中结合自己学习的心得专门介绍这一重要的特性。