手机旅游视频网站模板美食网站开发的原则
2026/4/3 16:55:29 网站建设 项目流程
手机旅游视频网站模板,美食网站开发的原则,自己做网站项目,网片围栏在讲C#之前#xff0c;我们有必要先了解一下.NET的体系结构#xff0c;因为C#虽然是一门独立的语言#xff0c;但其编译、运行都要依赖于.NET或者说其基类库。因此#xff0c;有必要先对.NET进行简要介绍。提示 第1章的内容是学习C#语言的基础#xff0c;如果你之前没有接…在讲C#之前我们有必要先了解一下.NET的体系结构因为C#虽然是一门独立的语言但其编译、运行都要依赖于.NET或者说其基类库。因此有必要先对.NET进行简要介绍。提示 第1章的内容是学习C#语言的基础如果你之前没有接触过.NET建议认真阅读如果你已经对.NET有足够的了解则可以略过本章但仍然建议通读一遍相信会有不同的收获。.NET是微软在互联网时代的一个战略性产品它是微软继Windows DNA之后的一个全新的、集成的、面向对象的开发平台。它以通用语言运行时Common Language Runtime为基础支持多种编程语言包括C#、F#、VB.NET、C、Python等等。.NET战略由微软在2000年6月22日提出2000年发布了首个.NET版本.NET 1.0 beta2002年正式问世至今近十载其间大小更新无数表1-1是其中的几个重要版本的更新如下所示。我们接下来看看.NET的体系结构如图1-1所示。从图1-1中可以看出.NET框架是在操作系统之上、应用程序之下的一个抽象层它就像一台虚拟的电脑负责管理运行在它之上的各种.NET应用程序的方方面面。理论上该框架是跨平台的基于其上的应用程序也是跨平台的。只是微软官方只提供了基于Windows平台的.NET框架实现同时由其他开源团体提供了基于非Widows平台的.NET框架实现例如Mono。另外从图1-1中还可以看到.NET框架自身的功能随着版本的升级而变得越来越丰富.NET框架的每一次升级都会给我们带来许多惊喜最近的4.0也不例外提供了很多好用的新功能具体内容会在后面的章节中一一介绍。使用.NET可以开发各种各样的程序从网络应用到桌面应用再到嵌入式系统应用和手机应用甚至是分布式的企业级应用。下面我们将重点讨论.NET的核心——.NET框架。1.1 .NET框架概述从某种意义上说.NET框架可以看作是.NET应用程序运行的虚拟机环境它为.NET应用程序提供编译、运行、内存管理、垃圾收集、安全等服务。换句话说.NET程序不需要与操作系统直接打交道只需要和.NET框架打交道就可以了。从这个意义上讲基于.NET框架开发的应用程序在理论上都是跨平台的只需要.NET框架有相应平台的实现版本即可。这就是.NET的“平台无关性”具体内容会在1.2节中介绍如图1-2所示。现实的情况是截止到目前微软官方并没有提供在非Windows操作系统平台上的.NET框架实现但开源界有两个项目正在致力于实现这一目标它们是Mono和Portable.NET。在后面的章节中我们会了解到其实这两者和微软提供的CLR一样都属于对CLI的实现感兴趣的读者可以自行查阅相关资料。如果你以前是做C、C开发的可能习惯于为应用程序申请内存并对之进行管理和释放现在不需要这样做了.NET框架会自动为应用程序分配内存并负责管理和回收。当然这种自动内存管理的特性在带来方便的同时也会带来一定的性能损失正所谓“鱼与熊掌不可兼得”。.NET框架主要由两个部分组成❑公共语言运行时Common Language RuntimeCLR❑.NET框架类库这里还有两个很重要的概念需要大家了解❑托管代码❑非托管代码什么是托管代码呢一般来说仅仅使用.NET公共语言运行时提供的功能的代码叫做托管代码反之就是非托管代码。换句话说在公共语言运行时控制之下运行的代码就是托管代码反之则是非托管代码比如使用VisualBasic 6.0编写的代码、ActiveX控件以及Win32 API都是非托管代码。另外托管代码和非托管代码还可以互相调用具体内容会在1.6节介绍如图1-3所示。注意并非.NET框架中的所有类库就都是纯粹的托管代码编写的.NET框架中有相当数量的类是对Win32 API的封装例如ProtectedData类。1.2 .NET的平台无关性在1.1节中提到了“平台无关性”这个特性知道了.NET应用程序并不直接依赖操作系统而是依赖中间层——.NET框架而实现的如图1-2所示。我们都知道Java的跨平台特性是靠虚拟机实现的虚拟机就像一台虚拟的电脑它负责与具体的操作系统、硬件设备打交道.NET程序和Java程序采用的方式类似操作系统和硬件设备对它们来讲是透明的它们被虚拟机加载、编译、运行和卸载。因此只需要为不同的操作系统和硬件设备开发相应的虚拟机对于.NET来说是.NET运行时对于Java来说是JVM。要了解.NET是如何实现的就需要了解一个新概念通用语言基础架构Common Language InfrastructureCLICLI是微软联合惠普等巨头于2000年向ECMA提交的技术规范该规范是开放的。CLI定义于.NET框架的一个子集它规定了如何在运行库中声明、使用和管理类型同时也是运行库支持跨语言互操作的一个重要组成部分。CLI要达到的目的如下❑建立一个支持跨语言集成、类型安全和高性能代码执行的框架。❑提供一个支持完整实现多种编程语言的面向对象的模型。❑定义各语言必须遵守的规则有助于确保用不同语言编写的对象能够交互作用。CLR是CLI这一规范的一种实现前面提到的Mono和Portable.NET是另外两种实现它们的关系如图1-4所示。1.3 公共语言运行时公共语言运行时CLR主要负责管理.NET应用程序的编译、运行以及其他基础服务它为.NET应用程序提供了一个虚拟的运行环境——实际上是VES虚拟执行系统。CLR还负责为应用程序提供内存分配、线程管理、安全以及垃圾回收等服务以及负责对代码实施严格的类型安全检查以保证代码安全、正确地运行。公共语言运行时的功能通过编译器和工具公开可以编写利用此托管执行环境的代码。使用基于公共语言运行时的语言编译器开发的代码称为托管代码。托管代码具有许多优点例如跨语言集成、跨语言异常处理、增强的安全性、版本控制和部署支持、简化的组件交互模型、调试和分析服务等。公共语言运行时自动处理对象布局并管理对象引用当不再使用对象时释放它们。按这种方式实现生存期管理的对象称为托管对象。垃圾回收消除了内存泄漏以及其他一些常见的编程错误。.NET Framework应用程序建立在公共语言运行时的服务之上并利用了.NET Framework类库。在.NET Framework 4中一种新运行时环境——动态语言运行时DLR将一组适用于动态语言的服务添加到了CLR中。借助于DLR可以更轻松地开发要在.NET Framework上运行的动态语言而且向静态类型化语言添加动态功能也会更容易。总之公共语言运行时提供了如下优点和特性❑基于公共语言运行时开发的应用程序性能得到了改进。❑允许使用用其他语言开发的组件。❑.NET类库提供可扩展类型。❑具有语言功能如面向对象编程的继承、接口和重载特性。❑允许创建多线程的可伸缩应用程序具有显式的自由线程处理支持。❑结构化的异常处理支持。❑自定义特性Attribute支持特性是一种用户自定义的元数据。❑垃圾回收特性。❑使用委托取代函数指针从而增强了类型安全和安全性。1.4 通用类型系统公共语言运行时的一个重要组成部分称为通用类型系统Common Type SystemCTS。.NET在设计中博采众长借鉴了各种主流编程语言的长处包括C、Java等。CTS定义了一个类型库无论是VisualBasic.NET还是C#它们的类型系统大体类似因此.NET将各种不同的编程语言的数据类型进行抽象就有了CTS。CTS为.NET平台上的各种编程语言提供了支持这样虽然每种编程语言都有自己独特的类型系统但编译后都会转换成CTS类型此时就可以实现不同语言编写的程序之间的互操作性。例如一个使用Visual Basic.NET编写的类的某个方法返回值类型为Integer而C#中某方法的参数类型为System.Int32这两个类型看起来似乎并不一致好像不能相互调用但由于Integer和System.Int32都对应CTS里的System.Int32类型因此它们的类型实际上是一致的故而相互调用的拦路虎——类型不一致问题就迎刃而解了。CTS类型主要分成两大类引用类型和值类型如图1-5所示。这两种类型之间也可以相互转换方法是装箱Boxing和拆箱UnBoxing这两个概念将在1.4.2节详细介绍。从图1-5我们可以得出如下几点结论❑CTS类型不是引用类型就是值类型❑引用类型直接继承自Object对象值类型继承自ValueType对象而ValueType对象继承自Object对象❑CTS类型不管是否直接继承自Object对象最终都继承自Object。1.4.1 值类型和引用类型值类型的变量直接存储数据而引用类型的变量持有的是数据的引用数据存储在堆中。例如我们常见到的String、Class、Interface等就是引用类型而Char、Int32、Boolean等都是值类型。对于引用类型数据而言由于数据存储在堆中指向它的引用可能不止一个因此当其他引用对数据进行修改时会影响到别的引用如图1-6所示。在托管代码中CTS为每种类型分配内存的方式只有两种❑分配在托管栈Stack中❑分配在托管堆Heap中前面已经提到内存的分配是由CLR管理的。这两种方式的区别是❑分配在托管栈中的变量会在创建它们的方法返回时自动被释放例如在一个方法中声明一个Char型的变量UserInput它的值是C当实例化它的方法结束时UserInput变量在栈上占用的内存就会自动释放如图1-6所示。❑分配在托管堆中的变量并不会在创建它们的方法结束时释放内存它们所占用的内存会被CLR中的垃圾回收GC机制释放。假如有一个String类型的变量Name它指向托管堆中的数据Hello World当方法调用结束的时候Name在托管栈上所占的内存会立即被释放但它在托管堆上的数据Hello World还会依然存在只不过此时可能没有变量引用指向它了它将持续等待直到未来某个时候被GC回收并释放所占内存如图1-6所示。注意 系统GC的执行是不可预期的也可以通过调用System.GC.Collect来强制执行GC。1.4.2 装箱和拆箱当值类型的数据转换为引用类型时CLR会先在托管堆配置一块内存将值类型的数据复制到这块内存然后再让托管栈上引用类型的变量指向这块内存这样的过程称为装箱Boxing反之则是拆箱UnBoxing。如图1-7所示托管栈中类型为Int32值为1023的变量装箱后引用类型变量位于栈中原来值类型变量的值被放入到托管堆的一个对象中其内容为1023类型为Object然后将位于托管栈中的引用类型变量指向堆中的这个Object类型的对象这就是装箱的整个过程。一般来说装箱操作不需要我们主动去做当将一个值类型的变量赋值给一个引用类型的变量时.NET框架会自动帮我们做装箱处理但拆箱操作并非自动的我们必须知道被拆箱的对象的实际类型然后明确地去执行拆箱操作如代码清单1-1所示。代码清单1-1 装箱和拆箱Int32 BirthdayNumber1023//Int32类型变量BirthdayNumber Object BoxingBirthdayNumberBirthdayNumber//系统自动装箱 Int32 UnBoxingBirthdayNumberInt32BoxingBirthdayNumber//明确地拆箱图1-8演示了拆箱的过程。有一点需要注意的是装箱和拆箱对性能是有影响的因为它花费了更多的时间。1.5 公共语言规范CTS中定义了大量的类型要求每种语言都全部实现并不现实亦无必要例如Visual Basic.NET就没有完全实现CTS因此在CTS这个大的集合中撷取其中的一部分要求各种语言都支持否则无法实现互操作这一小部分称作公共语言规范Common LanguageSpecificationCLS术语比较多大家可能一时难以理清它们之间的关系一图胜千言CLR、CTS、Common Language SpecificationCLS这3C之间的关系如图1-9所示从图1-9可以看出CLS是CTS的子集它还有了一些使用上的约定。CLS的终极目标就是要让.NET平台上用不同编程语言编写的对象之间可以互相调用。基于这个目标这就要求两种编程语言编写的对象中彼此公开的部分——类、接口、方法、字段等使用的都是CLS这个规范规定的数据类型并且遵守CLS的约定如图1-10所示。注意 并非每个程序集的公共部分都必须严格使用符合CLS规范的类型但这会让程序集在跨语言互操作性上受影响并影响潜在的客户群数量。1.6 语言的互操作性在1.5节中已经介绍了CLS的终极目标就是实现语言的互操作性那么CLS在语言的互操作性上起的作用可见一斑。语言的互操作性主要分下面两种情况。❑不同的.NET语言间互相调用我们先来看下图1-11使用C#编写的对象B可以从Visual Basic.NET编写的对象A继承还可以在对象B中对基类A中的方法执行重载、覆写等操作另外使用J#编写的对象C可以访问对象A并调用A的方法。可见语言的互操作性给我们的工作带来了非常大的灵活性。❑通过P/Invoke服务调用非托管代码编写的组件或服务例如COM组件具体请参阅第28章。1.7 即时编译在前文中我们从各个角度学习了.NET包括.NET的历史、体系结构和运行机制等不一而足接下来将探讨JIT机制。这里我们以C#代码的编译为例先简单介绍下C#C#被设计为一种简单的、现代的、通用的以及面向对象的编程语言它运行于公共语言运行时之上也就是说C#无法离开公共语言运行时而单独运行。C#在.NET框架上从编译到运行的过程如下1在编译期CLR对C#代码进行第一次编译生成中间代码的DLL或者EXE。2在运行期CLR将针对特定的硬件环境使用JIT即时编译引擎将中间代码编译为二进制代码并执行。3编译好的二进制代码被放到一个缓冲区缓存下次再调用相同的代码就直接从缓冲区调用也就是说相同代码的编译只会执行一次。图1-12演示了上述过程。1.8 中间语言中间语言以前曾经叫做MSIL现在统一称为CIL[1]。CIL与处理器的指令集非常相似它是CLR的汇编语言但它比真正的汇编语言要简单许多CIL甚至支持直接操作对象。CIL和CTS的关系十分密切。需要说明的是无论是C#还是Visual Basic.NET编译后的结果都是CIL。CIL指令集非常多表1-2是其中的一小部分。1.9 基类库使用Microsoft.NET的每个人几乎都会用到基类库Base Class LibraryBCL。BCL类似于SDK或者JDK它封装了大量的基础功能如文件操作、图形操作、网络连接、XML文档解析、安全加密等等。BCL的内容就好比一块块的积木我们可以对这些积木进行排列组合以实现我们的编程目标如图1-13所示。在.NET 4.0中BCL也新增了一些功能这些新功能的讲解分布在本书后面的各个章节中例如在第26章讲解了文件操作中的一些新增功能。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询