体验下一代微软平台开发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的新特性,我正在学习中,随后将贴文总结。

Blog重新开张

经历了几天的新鲜劲儿后,我的Blog从6月底开始到现在就再也没有过动静。三个月来,周围朋友的Blog如同雨后春笋般建立起来,且以惊人的速度进行着更新,于是,经历了有想法而无行动的几天后,我决定我的Blog重新开张。

国庆前一直盼着国庆回家,回到家才发现家里和在学校一样无聊。除了看看电视,就还是只能在电脑面前度过大量的时间。

项目开发的需要,让我在这个学期把久违的.NET又捡了起来。微软平台开发最近热点的恐怕是Smart Client莫属了,从DevDays 2004上第一次听到这个概念,到9月27日微软开发者大会上的Smart Client专题,加上MSDN上铺天盖地的文章,让人感觉到了Smart Client的无处不在。

DevDays 2004上的IssueVision示例程序,让我第一次到接触到Smart Client的概念,也让我又一次体会到软件构架的重要,暑假里对DevDays 2004 DVD上的IssueVision和OpenHack两个示例程序以及经典的.NET示例Duwamish进行了学习,学到了很多有用的东西。这次9月27日的开发者大会上,又介绍了一个新的Smart Client的示例程序TaskVision,回到家,我又迫不及待的把它下载了下来进行学习。

TaskVision程序与IssueVision很相似,但相对来说功能更强劲一些,它的功能是对工作中的各种任务进行管理,可以创建任务并把它指定给某人去完成,某人也可以重新把任务指定给其它人去完成,完成的进度和所有的转交情况都将被记录下来。作为Smart Clinet的示例程序,Smart Client的几个核心特性在这个程序中都有不错的体现。它的官方网站说它演示了以下的技术:

  • Application offline and online model(脱机和连机工作模式,这是Smart Client的核心特性之一)
  • Application update model via HTTP (no-touch deployment) (无接触部署,Smart Client的核心特性,通过AppUpdate组件实现,很Easy)
  • Authorization to control user access to application features
  • Data collision handling (有脱机支持就必须有良好的数据冲突处理机制,ADO.NET为我们提供了很好的工具)
  • Printing and Print Preview (一个IssueVision没有的特性,很简单,不过很实用)
  • Windows XP Themes
  • Dynamic properties
  • Localization support (也是一个IssueVision没有的特性)
  • Accessibility support (limited) (同样是新特性)
  • Forms authentication using a database for user names/passwords (这个验证方式与IssueVision用的不同,我正在学习)
  • Asynchronous XML Web service class (提高用户体验的很重要的特性,IssueVision用了一个BackgroundWorker组件,似乎比TaskVision用的方法很简单一些)
  • ADO.NET data access using SQL stored procedures (通过存储过程进行各种数据库操作,是微软反复强调的调用模式)
  • Graphics development using GDI+ (TaskVision用它做了一些可视化的组件)
  • Integration between .NET Framework-based code and COM applications (COM interop) (对于IssueVision的一个新特性,正好对我很有用,它通过COM interop把数据输出到一个Excel的Sheet,而我的项目中需要把数据输出到一个AutoCAD的图纸。)

让我很惊呀的一点是TaskVision居然没有对缓存在本地的数据进行加密,而IssueVision对这一点则做得很好。另外一点是IssueVision中用的很有用的Commander模式和Observer模式也没有在TaskVision中使用。从总体上说,感觉TaskVision虽然是一个新的示例程序,功能比较强大,但完善程度和制作的精细程度与IssueVision相比还是差了一些,GotDotNet网站有一个协作改进的项目。

国庆期间,除了学习TaskVision,另一件占据大量时间的事情就是协同刘海先生测试他的新软件iDreamPiano 1.0,从2000年试用了刘海的HappyEO 1.0这个键盘模拟琴软件后,我就一直与他保持比较多的联系,全线参与了HappyEO 1.05到3.05(该软件已获Tucows五头牛认证),Jp-Word 1.0到2.0(一个简谱编辑软件)和iDreamPiano的测试工作。iDreamPiano也是一个键盘模拟琴软件,目前功能还不能与HappyEO的功能相比,但从技术上说它有一个重要的改进,就是不再依赖系统的MIDI设备发声,而是直接通过dls波表和DirectX发声,这样做会有几个明显的好处:1.在不同的机器上可以达到一致的发声效果,2.没有MIDI软波表可能带来的延时的情况,3.不再受General MIDI或者Roland的GS和Yamaha的XG标准限制,可以扩展出任意多的音色,包括民族乐器的音色。