下载本文代码 下载本期杂志代码 |
微软的.NET是新的组件技术革命,它和下一版本的Visual Studio一起提供新的应用程序框架如Web Services、ASP.NET、 Windows Forms、 和ADO.NET。作为微软的下一代组件技术,.NET设计范围从底层一直到简化组件开发和发布,同时它提供空前规模交互性的编程语言。
这篇综述文章描述了.NET的关键概念,比如runtime和集合(assemblies),同时,它也简单介绍了.NET 的framework的各个方面。它也把.NET描绘成组件技术,把COM当作参考模式。我的目的是给你提供.NET的精髓信息,而不是教你如何使用它。我将会向你介绍足够的信息,这样你就知道它到底是什么和哪儿能够找到更多的信息。从而可以做出正确的决定和开始使用新技术规划你的产品。我将不会涉及所有的.NET技术,因为有些知识涉及到细节问题已经在本期的其它文章中做了详细介绍。
.NET Common Language Runtime
.NET基于Common Language Runtime (CLR)环境,这个环境管理你的代码运行时的每个方面。“common”意思是所有.NET组件,不论它是何种开发语言,都在同一个runtime运行。CLR就象一个温暖的毛毯包围着你的代码,它提供了内存管理、安全的运行环境、对象位置透明、并行管理和访问底层的操作系统服务。因为CLR管理项目行为的这些方面,所以在CLR上运行的代码叫“受管制代码”。
CLR提供了空前规模的语言交互性,允许组件重用,用COM技术是不可能实现这点的。COM也提供了语言独立性,允许两个二进位的组件用两种不同的语言开发,比如Visual Basic 和 C++,然后他们可以相互调用。但是COM的交互性仅在运行时存在。在开发时,.NET可以在一种语言开发中得到用另一种语言开发的组件。.NET可以做到是因为CLR是基于严格类型的系统。为了符合.NET规范,语言中的所有结构,比如class、struct,和原始类型,都必须编译成与CLR一致的类型。
这种语言的交互性是以牺牲现有的语言和编辑器为代价的。现有的编辑器生成CLR不认识的代码,这些代码不遵从CLR类型系统,不能被CLR所管理。为了解决这个问题,Visual Studio .NET包含了四种遵从CLR的语言:: C#, Visual Basic .NET, JScript .NET, 和受管制的C++。第三方编辑器的出售者也将建立针对CLR开发出超过20种语言的编辑器,从COBOL到Eiffel。
学习.NET编程语言
所有的.NET变成语言使用相同的基类、开发环境、CLR设计限制和CLR类型。在.NET中编译代码分为两个过程。首先,高级语言被编译成一般的语言叫做微软中间语言(IL),它和机器码有点相似。当运行时,第一次调用中间语言代码,.NET CLR编译中间语言成为本地语言,然后作为本地代码执行它。一旦编译后,本地代码就被使用直到程序终结。另一种选择是,你可以在安装时把它编译成本地语言。
IL是所有的.NET语言的共同部分,所以理论上,两种不同的语言等价构造体在编译成IL时应该是相同的。这样,所有的.NET语言在实现和开发难易度上是相同的。语言之间的不同在于美学和个人爱好。例如,为了使C++顺从CLR,你必须使用大量的编译指令和扩展,这叫C++的管制扩展,其结果是很少可读的代码。
与此类似的,Visual Basic .NET和以前的Visual Studio 6.0仅有一点相似。这就要求你忘记VB6的一些习惯。只有C#,它是新的.NET语言,没有遗留问题。C#源自C++,它组合了C++功能的强大性和VB6的易用性,提供了可读的,遵从CLR的类似C++的语言。实际上,C#更像标准的C++语言。C#也是纯粹的面向对象的语言,可以用来写可理解的和可重复使用的面向对象的代码。
我将在我的例子中使用C#,但记住你也可以用VB.NET和C++来做同样的事情。
.NET语言的其它特征包括基于异常的公共错误处理,把每个实体看作一个对象,实体包括原始类型,其结果得到一个完整的编程模式。CLR有丰富的、预定义的异常处理类,你可以照现在的样子使用它们,或者你可以为了特定的需求继承并扩展他们。一种语言抛出的异常可以在另一种语言中捕捉并处理。
开发.NET组件
.NET使得开发二进位的组件更加容易了。你不需要一个象ATL一样的框架,简单地声明一个类,它就可以变成一个组件(从.NET Magazine网站上下载列表1)。
基于接口的编程
面向组件开发的最重要的原则是分离接口和实现。COM强制把接口定义从实现他们的类中分离出来。.NET并不强迫你让类的公共方法成为接口的一部分,但是强制同一接口的不同实现是多态的。
列表1中的接口定义是程序的一部分。你不需要IDL文件。C#保留字“接口”允许你定义一个完全虚拟的,没有实现的,不能被客户端实例化的类型,和C++中纯粹的虚拟或者抽象类相似。接口方法不必返回HRESULT或者其它的错误处理类型。在出错的情况下,实现方法应该抛出一个异常。