C#使用手册-教程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第1章.NET体系结构我们不能孤立地使用C#语言,而必须和.NETFramework一起考虑。C#编译器专门用于.NET,这表示用C#编写的所有代码总是在.NETFramework中运行。对于C#语言来说,可以得出两个重要的结论:●C#的结构和方法论反映了.NET基础方法论。●在许多情况下,C#的特定语言功能取决于.NET的功能,或依赖于.NET基类。由于这种依赖性,在开始使用C#编程前,了解.NET的结构和方法论就非常重要了,这就是本章的目的。本章首先了解在.NET编译和运行所有的代码(包括C#)时通常会出现什么情况。对这些内容进行概述之后,就要详细阐述Microsoft中间语言(MicrosoftIntermediateLanguage,MSIL或简称为IL),所有编译好的代码都要使用这种语言。本章特别要介绍IL、通用类型系统(CommonTypeSystem,CTS)及公共语言规范(CommonLanguageSpecification,CLS)如何提供.NET语言之间的互操作性。最后解释各种语言如何使用.NET,包括VisualBasic和C++。之后,我们将介绍.NET的其他特性,包括程序集、命名空间和.NET基类。最后本章简要探讨一下C#开发人员可以创建的应用程序类型。1.1C#与.NET的关系C#是一种相当新的编程语言,C#的重要性体现在以下两个方面:●它是专门为与Microsoft的.NETFramework一起使用而设计的。(.NETFramework是一个功能非常丰富的平台,可开发、部署和执行分布式应用程序)。●它是一种基于现代面向对象设计方法的语言,在设计它时,Microsoft还吸取了其他类似语言的经验,这些语言是近20年来面向对象规则得到广泛应用后才开发出来的。有一个很重要的问题要弄明白:C#就其本身而言只是一种语言,尽管它是用于生成面向.NET环境的代码,但它本身不是.NET的一部分。.NET支持的一些特性,C#并不支持。而C#语言支持的另一些特性,.NET却不支持(例如运算符重载)!但是,因为C#语言是和.NET一起使用的,所以如果要使用C#高效地开发应用程序,理解Framework就非常重要,所以本章将介绍.NET的内涵。1.2公共语言运行库.NETFramework的核心是其运行库的执行环境,称为公共语言运行库(CLR)或.NET运行库。通常将在CLR的控制下运行的代码称为托管代码(managedcode)。但是,在CLR执行开发的源代码之前,需要编译它们(在C#中或其他语言中)。在.NET中,编译分为两个阶段:(1)把源代码编译为Microsoft中间语言(IL)。(2)CLR把IL编译为平台专用的代码。这个两阶段的编译过程非常重要,因为Microsoft中间语言(托管代码)是提供.NET的许多优点的关键。托管代码的优点Microsoft中间语言与Java字节代码共享一种理念:它们都是一种低级语言,语法很简单(使用数字代码,而不是文本代码),可以非常快速地转换为内部机器码。对于代码来说,这种精心设计的通用语法,有很重要的优点。1.平台无关性首先,这意味着包含字节代码指令的同一文件可以放在任一平台中,运行时编译过程的最后阶段可以很容易完成,这样代码就可以运行在该特定的平台上。换言之,编译为中间语言就可以获得.NET平台无关性,这与编译为Java字节代码就会得到Java平台无关性是一样的。注意.NET的平台无关性目前只是一种可能,因为在编写本书时,.NET只能用于Windows平台,但人们正在积极准备,使它可以用于其他平台(参见Mono项目,它用于创建.NET的开放源代码的实现,参见)。2.提高性能前面把IL和Java做了比较,实际上,IL比Java字节代码的作用还要大。IL总是即时编译的(称为JIT编译),而Java字节代码常常是解释性的,Java的一个缺点是,在运行应用程序时,把Java字节代码转换为内部可执行代码的过程会导致性能的损失(但在最近,Java在某些平台上能进行JIT编译)。JIT编译器并不是把整个应用程序一次编译完(这样会有很长的启动时间),而是只编译它调用的那部分代码(这是其名称由来)。代码编译过一次后,得到的内部可执行代码就存储起来,直到退出该应用程序为止,这样在下次运行这部分代码时,就不需要重新编译了。Microsoft认为这个过程要比一开始就编译整个应用程序代码的效率高得多,因为任何应用程序的大部分代码实际上并不是在每次运行过程中都执行。使用JIT编译器,从来都不会编译这种代码。这解释了为什么托管IL代码的执行几乎和内部机器代码的执行速度一样快,但是并没有说明为什么Microsoft认为这会提高性能。其原因是编译过程的最后一部分是在运行时进行的,JIT编译器确切地知道程序运行在什么类型的处理器上,可以利用该处理器提供的任何特性或特定的机器代码指令来优化最后的可执行代码。传统的编译器会优化代码,但它们的优化过程是独立于代码所运行的特定处理器的。这是因为传统的编译器是在发布软件之前编译为内部机器可执行的代码。即编译器不知道代码所运行的处理器类型,例如该处理器是x86兼容处理器还是Alpha处理器,这超出了基本操作的范围。例如VisualStudio6为一般的Pentium机器进行了优化,所以它生成的代码就不能利用PentiumIII处理器的硬件特性。相反,JIT编译器不仅可以进行VisualStudio6所能完成的优化工作,还可以优化代码所运行的特定处理器。3.语言的互操作性使用IL不仅支持平台无关性,还支持语言的互操作性。简言之,就是能将任何一种语言编译为中间代码,编译好的代码可以与从其他语言编译过来的代码进行交互操作。那么除了C#之外,还有什么语言可以通过.NET进行交互操作呢?下面就简要讨论其他常见语言如何与.NET交互操作。(1)VisualBasic2005VisualBasic6在升级到VisualBasic.NET2002时,经历了一番脱胎换骨的变化,才集成到.NETFramework的第一版中。VisualBasic语言对VisualBasic6进行了很大的演化,也就是说,VisualBasic6并不适合运行.NET程序。例如,它与COM的高度集成,且只把事件处理程序作为源代码显示给开发人员,大多数后台代码不能用作源代码。另外,它不支持继承,VisualBasic使用的标准数据类型也与.NET不兼容。VisualBasic6在2002年升级为VisualBasic.NET,对VisualBasic进行的改变非常大,完全可以把VisualBasic当作是一种新语言。现有的VisualBasic6代码不能编译为VisualBasic2005代码(或VisualBasic.NET2002和2003代码),把VisualBasic6程序转换为VisualBasic2005时,需要对代码进行大量的改动,但大多数修改工作都可以由VisualStudio2005(VisualStudio的升级版本,用于与.NET一起使用)自动完成。如果要把一个VisualBasic6项目读取到VisualStudio2005中,VisualStudio2005就会升级该项目,也就是说把VisualBasic6源代码重写为VisualBasic2005源代码。虽然这意味着其中的工作已大大减轻,但用户仍需要检查新的VisualBasic2005代码,以确保项目仍可正确工作,因为这种转换并不十分完美。这种语言升级的一个副作用是不能再把VisualBasic2005编译为内部可执行代码了。VisualBasic2005只编译为中间语言,就像C#一样。如果需要继续使用VisualBasic6编写程序,就可以这么做,但生成的可执行代码会完全忽略.NETFramework,如果继续把VisualStudio作为开发环境,就需要安装VisualStudio6。(2)VisualC++2005VisualC++6有许多Microsoft对Windows的特定扩展。通过VisualC++.NET,又加入了更多的扩展内容,来支持.NETFramework。现有的C++源代码会继续编译为内部可执行代码,不会有修改,但它会独立于.NET运行库运行。如果要让C++代码在.NETFramework中运行,就要在代码的开头添加下述命令:#usingmscorlib.dll还可以把标记/clr传递给编译器,这样编译器假定要编译托管代码,因此会生成中间语言,而不是内部机器码。C++的一个有趣的问题是在编译托管代码时,编译器可以生成包含内嵌本机可执行代码的IL。这表示在C++代码中可以把托管类型和非托管类型合并起来,因此托管C++代码:classMyClass{定义了一个普通的C++类,而代码:__gcclassMyClass{生成了一个托管类,就好像使用C#或VisualBasic2005编写类一样。实际上,托管C++比C#更优越的一点是可以在托管C++代码中调用非托管C++类,而不必采用COM交互功能。如果在托管类型上试图使用.NET不支持的特性(例如,模板或类的多继承),编译器就会出现一个错误。另外,在使用托管类时,还需要使用非标准的C++特性(例如上述代码中的__gc关键字)。因为C++允许低级指针操作,C++编译器不能生成可以通过CLR内存类型安全测试的代码。如果CLR把代码标识为内存类型安全是非常重要的,就需要用其他一些语言编写源代码,例如C#或VisualBasic2005。(3)VisualJ#2005最新添加的语言是VisualJ#2005。在.NETFramework1.1版本推出之前,用户必须下载相应的软件,才能使用J#。现在J#语言内置于.NETFramework中。因此,J#用户可以利用VisualStudio2005的所有常见特性。Microsoft希望大多数J++用户认为他们在使用.NET时,将很容易使用J#。J#不使用Java运行库,而是使用与其他.NET兼容语言一样的基类库。这说明,与C#和VisualBasic2005一样,可以使用J#创建ASP.NETWeb应用程序、Windows窗体、XMLWeb服务和其他应用程序。(4)脚本语言脚本语言仍在使用之中,但由于.NET的推出,一般认为它们的重要性在降低。另一方面,JScript升级到JScript.NET。现在ASP.NET页面可以用JScript.NET编写,可以把JScript.NET当作一种编译语言来运行,而不是解释性的语言,也可以编写强类型化的JScript.NET代码。有了ASP.NET后,就没有必要在服务器端的Web页面上使用脚本语言了,但VBA仍用作Office文档和VisualStudio宏语言。(5)COM和COM+从技术上讲,COM和COM+并不是面向.NET的技术,因为基于它们的组件不能编译为IL(但如果原来的COM组件是用C++编写的,使用托管C++,在某种程度上可以这么做)。但是,COM+仍然是一个重要的工具,因为其特性没有在.NET中完全实现。另外,COM组件仍可以使用——.NET组合了COM的互操作性,从而使托管代码可以调用COM组件,COM组件也可以调用托管代码(见第33章)。在一般情况下,把新组件编写为.NET组件,其多数目的是比较方便,因为这样可以利用.NET基类和托管代码的其他优点。1.3详细介绍中间语言通过前面的学习,我们理解了Microsoft中间语言显然在.NETFramework中有非常重要的作用。C#开发人员应明白,C#代码在执行前要编译为中间语言(实际上,C#编译器仅编译为托管代码),这是有意义的,现在应详细讨论一下IL的主要特征,因为面向.NET的所有语言在逻辑上都需要支持IL的主要特征。下面就是中间语言的主要特征:●面向对象和使用接口●值类型和引用类型之间的巨大差别●强数据类型●使用异常来处理错误●使用特性(attri

1 / 305
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功