体验下一代微软平台开发Visual Studio 2005(3)

忙了好几天,终于又找到了一点空闲的时间来继续我们体验历程,今天我们要一起体验的是Visual C# 2005 Express Edition Beta。

Visual C# 2005 Express Edition Beta

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的地址试一下:)

自制RSS阅读器界面

自制RSS阅读器界面

从默认生成的项目中,我们可以看到,与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");
}
);

VC# 2005中的重构

VC# 2005中的重构

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中一样做了相应的改进,这些改进的特性都给程序员带来了很大的方便。

VC# 2005中的重构

VC# 2005中的重构

准备收笔了却发现我忘记介绍了C#2.0中的一个最为重要的新特性:泛型。其实真得不是忘了,而是我对它的了解还相当的少,建议感兴趣的朋友先去看看大师们的文章吧,我会在后面的文章中结合自己学习的心得专门介绍这一重要的特性。

体验下一代微软平台开发Visual Studio 2005(2)

今天我们一起来详细探索一下VC++2005中C++/CLI为我带来了哪些新的特性。

首先,C++/CLI引入了一些新的数据类型关键字:

ref class/ref struct、value class/value struct、interface class/interface struct、enum class/enum struct,在C++/CLI中class和struct不具有C#的语意,而是仍然保持在C++中的区别,即默认的访问级别不同。在C++/CLI中,ref class/ref struct具有C#中class的语意,而value class/value struct具有struct的语意。相应的interface class/interface struct和enum class/enum struct分别类同于C#中interface和enum的语意。在这里,以ref class为例,虽然它们是两个单词,但它们共同组成了一个关键字,也就是说,在C++/CLI中,关键字中可能会包含空格,就是要把多个单词合起来理解成是一个关键字,而不能把它们孤立开。

在C++/CLI中,关键字还分为上下文敏感和上下文不敏感的,前面提到的关键字都是上下文不敏感的,即它们无论出现在哪里,都表示是关键字,不能用作标识符。而上下文敏感的关键字则只在它们应当出现的地方才作为关键字,否则将不具备任何特殊的含义,包括可以作为标识符使用。

新加入的上下文敏感数据类型关键字有:property、delegate和event,它们基本上都对等于C#中的相应关键字。

除了数据类据关键字,C++/CLI还引入其它一些新的关键字:abstract、new、override、sealed、generic、where、finally、gcnew、initonly、literal、nullptr,它们与它们在C#中的含义基本一致,稍后我会对其中部分C#中没有关键字作介绍。

C++/CLI中还引入了两个新的运算符,^和%,它们用于支持C++/CLI中新的“名柄”的概念。除此以外,C++/CLI还引入了一些新语言构造,它们是以库的型式来实现的,不作为关键字出现。

在C++/CLI中,由于引入了托管堆,所以,内存分配方法除了C++原有的Native的栈分配和堆分配,又多出一种在托管堆上的分配,配合这一理念的语法特性就包括了句柄,^和%运算符,gcnew等关键字。

下面是一个代码片断,举例说明了在C++/CLI中使用托管代码的情况:

ref class R
{
private:
int m_value;
public:
property int Value
{
int get()
{
return m_value;
}
void set(int value)
{
m_value = value;
}
}
};
int main()
{
R ^ r = gcnew R();
r->Value = 6;
}

这里演示了ref class即托管类的用法,还有新的property关键字以及托管对象分配的方法。可以这样理解^符号,它就是一种托管的指针,相当于Managed C++中的__gc指针,用它可以指向一个托管的对象,语法上用起来与*一致,只不过得用gcnew而不是new才能返回一个^类型的指针(称为句柄)。与此同时,新增的%运算符其实就对应了C++原来的&运算符,只不过它是用于托管对象的。而新增的nullptr关键字则相当于在C#中的null关键盘,用于表示一个空的托管对象引用。从这个程序中可以看出C++/CLI从语法层面上要比Managed C++好看好用得多。

喜欢C++的人往往都是对性能很敏感,对内存分配也很敏感,虽然在托管的情况下,内存分配从来就不是一个大问题,不过很多情况下我们也希望对对象的释放作更多的控制。在C#中用using(…){}就可以保证在对象超出个区域时自动调用它的IDisposable.Dispose()方法释放资源,C++/CLI提供了更优雅的写法:

int main()
{
R r;
r.Value = 6;
}

这样就行了,注意,是个托管引用对象,所以它并不会在栈上生成,它仍会在托管堆生成,但在栈上有对它的引用,并保证在超出引用域时调用IDisposable::Dispose()方法。很遗憾,在我下载试用的Visual C++ 2005 Beta 1中,这个特性似乎并没有实现,上面的写法会出现语法错误,据说是要打上Update补丁才可以支持。

C++/CLI就先说这么多,VC的文档中Express Library for Visual Studio/Visual C++ Express Edition/Reference/C/C++ Languages/C++ Language Reference/New C++ Language Features一节中比较全面的列出了C++/CLI中的新特性,通过它可以迅速的帮助我们了解C++/CLI。

Visual C++ 2005为我们带来了C++/CLI,而Visual C# 2005同样也为我们带来了新东西,C# 2.0在C#的基础上作了很多的改进,尤其是引入了泛型,我们后面再一起来体会它吧。

体验下一代微软平台开发Visual Studio 2005(1)

今天无聊在微软网站闲逛,不小心看到了Visual Studio 2005的各组件的Express Beta版本下载,于是就把它们下载了来下来试用。

最早看到有关VS2005的介绍是在DevDays 2004上,那时还是一个Preview的版本,随后就是在上一次的微软开发者大会上发到的MSDN开发精选杂志上看到了相关的介绍,但一直没有机会去尝试,这回就一起来尝尝鲜吧。

这次提供下载的是VS2005 Express Beta 1版包括VB、C#、VC++、J#、WebDev和SQL Server的2005版本,但都是Express即精简的版本,只提供了最基本的功能。另外与之配套提供下载的还有.NET Framework 2.0、VJ# Redistributable Pack 2.0和精简版的MSDN。这也东东也可以向微软订购免费的光盘,可惜要支付$30的邮费。

我依次安装了.NET Framework 2.0、VJ# Redistributalbe Pack和SQL Server 2005。然后安装VC++(其它几个包还在下载中)。整个过程都相当的顺利,除了SQL Server安装程序提醒我我的机器配置太低外:(

先来看看VC++吧。

VC 2005 界面

VC 2005 界面

界面上最明显的变化其实是最不重要的变化,与VS.NET2003相比,只不过是风格和布局有所调整。但我们也能看到一些新特性。

首先是增加了三个面板,左边的Program Manager,中间的Definition和Call Browser。

Program Manager的功能实话说我也没有闹明白,好像是用于管理一个项目的多种生成模式的设置的,比如Debug模式、Release模式等等。

Property Manager

Property Manager

Definition面板的功能我在Source Insight中见过,还是比较有用的,就是当编辑区中光标落在某个标识符上时,Definition面板中将相应显示出这个标识符的定义供你参考,并可以迅速切换到相关的位置以便修改。

Call Browser面板则可以显示出一个方法调用了其它哪些方法以及这个方法在哪些地方被调用过。感觉上这个功能对代码重构会很有帮助。很遗憾在VC++中没有找到重构的功能,好像只是在VC#中实现了。

VC++从2003版开始支持了Windows Forms的可视化设计,在2005版中,窗体设计功能也有了不少的进步,最明显的就是控件自动对齐功能,省去了原先很烦的对齐控件的操作。智能标记的功能(如果用过VS2003做ASP.NET就会注意到控件角上会有一个绿色的小三角,这就是智能标记功能,但那时并没有用)也开始在部分控件上使用。窗口设计器还增加了一种称为Property Editing View,可以对控件的常用属性进行十分方便的修改。

Windows Forms设计器

Windows Forms设计器

Windows Forms设计器

Windows Forms设计器

同时,就Windows Form本身而言,.NET 2.0也为它增加了不少的控件,新的DataGridView控件取代了原来的DataGrid,还增加了Serial Port(操作串口)、BackgroundWorker(多线程)、WebBrowser(对WebBrowser ActiveX控件的托管封装版本)等不少实用的组件。很遗憾的是我没有在这个Express版中找到对ADO.NET的支持,所以对数据访问还没有能有所认识。

其实VC2005最大的变化恐怕并不是开发环境的变化,由于原先VC用于支持.NET的Managed C++语法实在过于麻烦难看,所以VC2005引入了全新的语法来支持.NET,这就是最近的一个热门话题C++/CLI,它对标准C++进行了扩展,目前正在进行国际标准化的工作。关于C++/CLI的新特性,我正在学习中,随后将贴文总结。

Emacs入门指南(3)

通过前两篇文章的学习,您已经可以把Emacs当作一个Better-Notepad来使用了。今天我们要学习的是Emacs中强大的搜索功能。

默认情况下,Emacs采用了一种很待殊的”增量搜索”的功能,虽然它与我们常用的搜索方法在操作习惯上有很大的不同,但习惯后确实是十分的方便。

要让Emacs开始执行搜索,可以按C-s或C-r,前者是从光标位置往后查找,后者则是往前查找。我们以C-s为例。按动C-s后,Emacs在Minibuffer中提示: I-Search:,这时您便可以输入要搜索的关键字了,现在学习试验的阶段建议您输入时手脚慢一点,看看Emacs是如何来执行您的搜索请求的。

比如,要搜索“search”一词,您输入s,这时Emacs会把光标移动到最近一个s字母上,这里如果您暂停输入一会儿,Emacs就会把所有的s字母进行高亮。您继续输入e,这时Emacs就找到了最近的se字母组合。一直输入下去,直到Emacs找到您要找的内容,这时按回车键即可结束查找。

在查找过程中,您可以反复按动C-s或C-r来执行向后或向前的查找。如果您已经找到一了一个匹配的内容,并且按了回车键结束了查找,这时如要继续查找这个内容,您只需按两次C-s或C-r即可,第一次按动用于激活查找功能,而第二次按动则表示要继续查找。

在输入查找关键字时,如果不小心输错了,可以按动<DEL>键来清除前一个字符,请注意,在Emacs术语中,<DEL>键是指我们通常所说的<BackSpace>键,而<DELETE>键才表示我们键盘上的<Delete>或<Del>键。

输入关键词时也有一个细节的问题,如果您输入的关键字全部是英文小字母,则Emacs会进行不区分大小写的查找。但如果输入的关键字中包含有大写字母,Emacs就会进行区分大小写的查找。另外在查找的过程中,可以通过M-c快捷键来切换区分大小字模式,可以用它来强行指定是否区分大小写。

如果不想用Emacs的增量搜索功能,也可以让Emacs进行传统的搜索,在按下C-s或C-r后,直接打一个回车键,这时Emacs就将进行非增量搜索,您可以输入你的关键字,再按回车键来执行搜索。

下面要介绍的是更为强大的正则表达式搜索功能。您可以通过按动C-M-s或C-M-r来启动正向或反向的正则表达式搜索功能,Emacs会在Minibuffer中提示Regexp I-search:,这时您便可以输入正要匹配的正则表达式了。

在正则表达式中可以使用很多的控制符号,这里我挑选几个常用的作一个简单的介绍,更全面复杂的解释可以在Emacs的手册中查到。

‘.’ (句号): 正则表达式的中句号可以用于匹配一个任意的字符。比如正则式’a.b’就可以匹配abb,acb,adb。。。等等以a开头以b结尾的三个字符的字符串。

‘*’: 正则表达式中的*号可以用于表示把它前面的字符重复0次或多次。比如’ff*’可以匹配一个或多个相连的f的字符串。

‘+’: 正则表达式中的+号与*号的作用基本相同,区别在于它表示把它前面的字符重复1次或多次,所以可知正则式’ff*’等价与’f+’。

Emacs的正则表达式语法十分复杂与强大,请您阅读Emacs手册来对它们进行全面的学习,一定会给您的工作带来巨大的便捷,作为一篇入门教程,这里我就不再作更全面的叙述了。

———–

附注,我要被这篇文章整死了,先是怎么也贴不上文章,系统非说我的文章中出现禁止的词语,不予接受,好不容易查出来了,是文末的“巨大(的)便捷”这个词搞鬼,我一开始没写那“的”字。

好不容易贴上了,得,<DELETE>这个词给我变成删除线了,要知道我可是已经把大于小于号改成相应的HTML编码了,没办法呀,又改了一次,这篇文章真是贴了不知多少遍才贴上呀。太辛苦了!

Emacs入门指南(1)

很早就听说Emacs这个开源的文件编辑器了,听说它的功能非常的强大,于是决定试用一下,没想到试用结果是这个“最好用”的编辑器给我的第一印象是“不知所揩”,但随着不断的学习,我开始体验到Emacs的巨大魅力,并着手开始这个入门提南,希望能把这个文本编辑器介绍给更多的朋友。如果您已经熟悉Emacs,这个指南不是为您准备的,这个指南只打算介绍Emacs中最基本的功能,为初学者提供一个入门的机会。另外这篇文章是以Windows平台下的Emacs来讲述的,如果您在其它平台上使用,也可以参照着看看。

废话少说,我们开始我们的学习之旅吧。

首先当然是要获得Emacs软件的程序包并安装它,在http://www.gnu.org/software/emacs/emacs.html上的第5节Obtaining GNU Emacs中您可以找到它的下载地址。我下载的是emacs-21.3-fullbin-i386.tar.gz这个Windows平台上21.3版的完整包。您也可以通过Emacs在savannah.gnu.org的CVS下载最新的Emacs单个文件。(什么?不知道什么是CVS?哦,它是一个开源的版本控制软件,不知道就当我没说这句话吧。下回我再写个CVS的入门指南。)

Emacs不用安装,直接解压后就可以使用了,我把它解在了D:/Program Files/emacs-21.3目录中,以后可能会提到“Emacs的安装目录”就是指它。

在Emacs的安装目录下的bin目录中就有Emacs的可执行文件了,它是emacs.exe,双击即可运行它。如果希望在控制台环境下以控制台风格来运行它,可以加上参数-nw,表示No Window。另外,运行bin目录中的addpm.exe,可以自动为Emacs在开始菜单中建立一个菜单项。我还建议大家在系统的Send To文件夹中为Emacs.exe建立一个快捷方式,这样什么想用Emacs打开的文件都只要用右键点它选“发送到”Emacs就可以了。

相信到现在为止,大家已经看到Emacs不那么友好的界面了,刚启动Emacs时它会出现一个介绍的封面,点鼠标或按任意键就会切换到一个名为*scratch*的Buffer,上面有三行注释,说你可以在这里随便写点不需存盘的文字,或者可以打一些要执行的Lisp语句,如果要创建文件,请按C-x C-f。

在真正开始使用Emacs之前,请大家注意下面一点:

由于历史的原因,Emacs中很多术语、表示方法和操作习惯与现在惯用的不一致,在学习时要时刻记住这一点,避免混淆。在本文中,将遵循Emacs术语,表用英文表示。

开始编辑一个新文件的方法是按C-x C-f,这个表示法的意思是:先按一下Ctrl+x,然后再按一下Ctrl+f(当然你也可以按着Ctrl不放,分别敲x和f键)。这时,在Emacs的Frame(在Emacs术语中,Frame是指我们习惯上在Windows中说的“窗口”,而Window这个术语是指在一个Frame中的几个独立的区域)底部的Minibuffer中会出现提示:Find file: D:/Program Files/emacs-21.3/bin/,在这里就可以输入要新建的文件的文件名了,默认的路径就是D:/Program Files/emacs-21.3/bin/。如果不改变默认路径,直接输入一个文件名,它就会在Emacs中新开一个空白Buffer用于编辑。如果输入一个已存在的文件名,就会在一个新的Buffer中打开这个文件用于编辑。也就是说C-x C-f是一个可以用于新建或打开文件的命令,难怪它在Emacs手册中被解释为Visit a file而不是New file或Open file。

在大多数的情况下,您似乎并不会很乐意在默认的Emacs安装目录下建立文件,所以您可能需要把已经出现的默认路径清除再写您的实际的路径。其实不需要这样麻烦,Emacs在很多很细小的东西上都做的非常人性化,您只需在它的默认路径最后一个/后接着打一个/就可以直接输入实际的文件路径了,比如,我不管它的默认路径,直接输入/C:/1.txt就可以建立或打开C盘根目中的1.txt文件了,在输入路径和文件名时,可以只输入一部分,然后按<Tab>键,Emacs会设法帮您自动补充完整,就像在Linux和高版本Windows命令提示符下输入文件名和路径一样。

Emacs的很重要的一个设计理念就是要让您的双手在整个操作过程中不离开主键盘(就是指字母和数字键这个区域),以追求最高的工作效率。所以本文中对鼠标操作的介绍会比较少。

如果要用鼠标来操作Emacs新建或打开一个文件,可以点File菜单的Open File一项。用键盘也可以选菜单,但决不是Alt+F之类的,您可以按F10键,然后再选项相应的菜单项,F10的表现型式在Windows界面下和在Console界面下是不一样的,但操作方法一致。

现在您已经正确的打开了一个新的Buffer来编辑文件了,您可以试着输入一些东西。输入中,如果超过了行末,Emacs会自动换行并显示一个续行符。

也许您在输入过程中尝试了“复制/剪切/粘贴”这样的操作,结果一定很令人失望,Windows中常用的Ctrl+C/Ctrl+V等快捷键都不对了,再次提醒您记住,学习Emacs就要忘记以前很多的东西。当你慢慢熟悉Emacs,你会喜欢这个强大的编辑器的。

在您发现在敲快捷的过程中发生了错误,在大多数的情况下,您可以按C-g快捷键来中断当前的错误命令从头开始。比如您不小心按了C-s,这是Windows中保存文件常用的快捷键,它却在Mini-Buffer中提示您I-search:这里就可以按C-g退出,返回正常状态,同时Minibuffer中会显示Quit表示退出了当前命令。

要保存文件,正确的命令是C-x C-s。要退出Emacs,正确的命令是C-x C-c,如果有Buffer中的内容修改了未保存,它会作相应的提示,如果您选择不存,它还要进一步确认是否真的要退出Emacs。

至此,您已经可以用Emacs打开或新建一个文件,编辑并保存,然后退出Emacs了。

也许您觉得我写得挺罗嗦的,进度也很慢,您可以不看我的文章,直接去阅读Emacs的教程,它用很精辟的方式描述了Emacs最基本的使用方法。进入Emacs后,按C-h t(先按C-h,再按t键,注意不是C-h C-t)就可以阅读它了。目前Release的Emacs中还没有包含中文的教程,您可以在Emacs的CVS的etc目录中找到中文的教程,文件名为TUTORIAL.cn(简体)和TUTORIAL.zh(繁体),下一版的Emacs中应该会包含这些文件。