.Net基础--.Net体系结构
.Net是微软开发的一个集成的、面向对象的开发平台,它以通用语言运行时(CLR)为基础,支持C#、F#、C++等多种编程语言(编程语言可以互操作)。
.Net框架是运行在操作系统之上、应用程序之下的,它负责管理所有运行在它之上的.Net应用程序。.Net框架是跨平台的,运行在它之上的应用程序也是跨平台的,只是微软官方只提供了运行在Windows平台上的.Net框架(如果他也提供可以运行在其他平台上的.Net框架,不是扇自己耳光吗),但是已有开源团队提供了基于其他平台的.Net框架。
.Net能够支持多种编程语言互操作,是因为有通用语言基础架构(CLI)。通用语言基础架构是一个开放的技术规范,它规定了如何在库中声明、使用和管理类型。它的目的是:
1、建立一个支持跨语言集成、类型安全、高性能执行代码的框架;
2、提供一个支持完整实现多种编程语言的面向对象的模型;
3、定义各语言必须遵守的规则,有助于确保用不同语言编写的对象能够交互作用。
.Net框架相当于虚拟机,它为.Net应用程序提供编译、运行、内存管理、垃圾回收等服务,也就是说,.Net应用程序和操作系统没有交集,它只需要和.Net框架打交道。
.Net框架主要包含两部分,即公共语言运行时和类库。仅仅使用.Net公共语言运行时提供的功能的代码叫做托管代码,反之就叫做非托管代码,托管代码有很多优点,如:跨语言集成、跨语言异常处理、增强安全性、版本控制和部署支持、简化的组件交互模型、调试和分析服务等。
公共语言运行时有如下优点和特性:
1、基于公共语言运行时开发的应用程序性能得到了改进;
2、允许使用其他语言开发的组件;
3、.Net类库提供可扩展类型;
4、具有语言功能,如面向对象编程的继承、接口和重载特性;
5、允许创建多线程的可伸缩应用程序,具有显示的自由线程处理支持;
6、结构化的异常处理支持;
7、自定义特性支持(特性是一个用户自定义的元数据);
8、垃圾回收特性;
9、使用委托取代函数指针,从而增强了类型安全和安全性。
公共语言运行时有一个重要的组成部分,叫做通用类型系统(CTS),它由各种不同的编程语言的数据类型抽象而来。所以,虽然各种编程语言都有自己的数据类型,但在编译后都会转换成CTS类型,也就实现了多种编程语言编写的程序之间的互操作性。
CTS类型分为值类型和引用类型两种,这两种类型可以相互转换。引用类型直接继承自Object对象,而值类型直接继承自ValueType对象,而ValueType对象继承自Object对象,所以CTS类型最终都继承自Object对象。值类型的变量直接存储数据,而引用类型的变量存储的是数据的引用,而数据本身存储在堆中。
CTS为每种类型分配内存的方式只有两种,即托管栈、托管堆。这两种方式的区别是:分配在托管栈中的变量会在创建它们的方法返回时自动被释放;分配在托管堆中的变量并不会在创建它们的方法结束时释放内存,它们所占用的内存会被CLR的垃圾回收机制释放。
当值类型转换为引用类型时,CLR会先在托管堆中配置一块内存,将值类型的数据复制到这块内存,然后再让托管栈上引用类型的变量指向这块内存,这样的过程叫做装箱,反之则叫做拆箱。
.Net中语言的互操作性主要有两方面:
1、不同的.Net语言间的互相调用。如:使用C#编写的对象B可以从VB.Net编写的对象A继承,还可以在对象B中对基类A的方法进行重载、重写等操作。
2、通过P/Invoke服务调用非托管代码编写的组件或服务,如COM组件。
即时编译
以C#为例,在.Net框架中它从编译到运行的过程如下:
1、在编译期,CLR对C#代码进行第一次编译,生成中间代码的DLL或者EXE;
2、在运行期,CLR将针对特定的硬件环境使用JIT(即时编译引擎),将中间代码编译成二进制码并执行;
3、编译好的二进制代码被放到一个缓冲区缓存,下次再调用相同的代码就直接从缓存区调用,也就是说相同代码的编译只会执行一次(但这一次有两个编译步骤)。
基类库(BCL)
BCL类似于SDK或者JDK,它封装了大量的基础功能,如文件操作、图形操作等等。有了BCL,我们就可以更加方便、高效的编写程序。
浙公网安备 33010602011771号