内容提要:
(1)编译和运行面向对象.NET代码
(2)IL/MSIL(Microsoft Intermediate Language)中间语言的优点
(3)值类型与引用类型
(4)数据类型化
(5)程序集、.NET基类和名称空间
一、.NET和C#
对于C#语言来说:C#的结构和方法论反映了.NET基础方法论;在许多情况下,C#的特定语言功能取决于.NET的功能,或依赖于.NET基类。
Q:.NET与c#的关系?
A:C#是专门为与Microsoft的.NET Framework一起使用而设计的(.NET Framework 是一个功能非常丰富的平台,可开发、部署和执行分布式应用程序)。
注意:C#就其本身而言只是一种语言,尽管它是用于生成面向.NET环境的代码,但它本身不是.NET的一部分。.NET支持的一些特性,C#不支持。而C#语言支持的另一些特性,.NET却不支持(例如:运算符重载)。
二、 公共语言运行库(CLR,Common Language Runtime)
托管代码(Managed Code):在CLR控制下运行的代码。
Q:.NET 是如何编译代码的?
A:(1)将源代码编译为中间语言(IL);(2)CLR把IL编译为平台专用的代码。
Q:使用IL有哪些优点?
A:平台无关性(理论上的)、提高性能和语言的互操作性。
即时编译(JIT,Just In Time)
Q:为什么托管IL代码几乎和本地机器代码的执行速度一样快?
A: JIT编译器并不是把整个应用程序一次性编译完,而是只编译它调用的那部分代码。代码编译过一次后,得到的本地可执行程序就存储起来,直到退出该应用程序为止,下次运行该代码时,就无需在编译。
Q:为什么IL即时编译可以提高性能?
A:因为编译过程的最后一部分是在运行时进行的,JIT编译器确切地知道程序运行在什么类型的处理器上,可以利用该处理器提供的任何特性或特定的机器代码指令来优化最后的可执行代码。
Q:IL是如何体现语言的互操作性的?
A:将任何一种语言(.NET 支持的语言)编译为中间语言,编译为中间语言的代码可以与从其他语言编译过来的代码进行交互操作。
三、中间语言(IL)
Q:IL的主要特征?
A: 面向对象和使用接口,值类型和引用类型之间的显著差异,强数据类型化,使用异常处理错误和使用特性。
Q:什么是接口理念?
A:提供一个契约,实现给定接口的类必须提供该接口指定的方法和属性的实现方式。
Q:语言互操作性的含义?
A:用一种语言编写的类应能直接与另一种语言编写的类通信。主要可以体现在:
(1)用一种语言编写的类应能继承另一种语言编写的类。
(2)一个类应能包含另一个类的实例,而不管两个类是什么语言编写的。
(3)一个对象应能直接调用用其他语言编写的另一个对象的方法。
(4)对象(或对象的引用)应能在方法之间传递。
(5)在不同的语言之间调用方法时,应能在调试器中交替调试这些方法调用,即调试不同语言编写的源代码。(Visual Studio IDE已经实现该功能,注意该功能不是CLR提供的。)
Q:什么是值类型,什么是引用类型?
A:值类型(Value Type),变量直接存储数据。引用类型(Reference Type),变量仅存储地址,对应的数据可以再改地址中找到。
IL数据存储的规范:引用类型的实例总是存储在一个名为托管堆的内存区域中,值类型一般存储在堆栈中(如果值类型在应用类型中声明字段,它们内联存储在堆中)。
通过类型系统(CTS,Common Type System);公共语言规范(CLS,Common Language Specification);CLS和CTS一起确保语言的互操作性。
Q:什么样的对象会被.NET 垃圾回收器回收?
A:一个对象不被任何其他对象所引用时,GC采用一定的算法在托管堆中遍历所有对象,构成一个对象图,而不可以到达的对象将成为被释放的垃圾对象。
Q:.NET 垃圾回收的工作原理?
A:每个应用程序都有一组根(指针),指向托管堆中的存储位置,由JIT编译器和CLR运行时维护根指针列表,主要包括全局变量,静态变量,局部变量和寄存器指针等。垃圾收集器就是通过指针列表来实现托管堆中的对象图,当垃圾回收器启动时,它假设所有对象都是可回收的垃圾,然后开始遍历所有的根,将根引用的对象标记为可达对象图中,依次类推,垃圾收集器通过根列表的递归遍历,将能找到的所有可达对象,形成一个可达图。同时不可到达的对象则认为是可回收的对象。这种算法一般称为:标记和清除算法。
内存管理周期性的执行内存清理工作,一般按照以下步骤启动垃圾收集器:
(1)第0代(代龄)对象充满时。
(2)强制执行GC.Collect方法。
(3)windows报告内存不足,CLR将强制执行垃圾回收。
(4)CLR卸载AppDomain时,GC将对所有代龄的对象执行垃圾回收。
垃圾收集器将托管堆中的对象分为三代:第0代(容量256KB),第1代(容量2MB),第2代(容量10MB),其中第0代对象的回收的效率最高,CLR初始化后,被添加到托管堆中的对象都被定为第0代,当有垃圾回收执行时,未被回收的对象升级为第1代对象,而后新建的对象仍为第0代对象。也就是说代龄越小,表示对象越新,通常情况下生命周期越短。因此垃圾收集器总是首先回收第0代的不可到达对象的内存。第0代对象内存不足以创建新的对象,同时第1代对象的体积也超出了容量值时,垃圾回收器将同时对第0代和第1代对象进行垃圾回收。回收后未被收回的第1代对象升级为第2代对象,未被回收的0代对象升级为1代对象,而后新建的对象仍为第0代。垃圾收集正式上述过程的不断重复。
强数据类型化带来的安全性:.NET很好的弥补了Windows提供的安全机制,因为它提供的安全机制是基于代码的安全性,而Windows仅提供了基于角色的安全性。
Q:什么是应用程序域?
A:应用程序域是.NET中的一个重要技术改进,它用于减少运行应用程序的系统开销,这些应用程序需要与其他程序分离开来,但仍需彼此通信。
应用程序域是分离组件的一种方式,它不会导致因在进程间传递数据而产生的性能问题。
其方法是把任何一个进程分解到多个应用程序域中。每个应用程序域大致对应一个应用程序,执行的这个线程都运行在一个具体的应用程序域中。
Q:.NET 如何处理运行时的错误?
A:.NET通过异常机制来处理运行时的错误情况。异常结构确保在发生错误情况时,执行进程跳到最有针对性的异常处理例程上,来处理错误。
四、程序集
Q:什么是程序集?
A:程序集(Assembly)是包含编译好的、面向.NET Framework的代码的逻辑单元。
注意:程序集是完全自描述的,它不是一个物理单元,可以存储在多个文件中。
注意:可执行代码和库代码使用相同的程序集结构。唯一区别是可执行代码的程序集包含一个主程序入口点。
Q:程序集的特性?
A:程序集的一个重要特性时它们包含的元数据描述对应代码中定义的类型和方法。程序集也包含描述程序集本身的元数据,这种程序集元数据包含在一个清单(Manifest)的区别当中,可以检查程序集的版本及其完整性。
Q:私有程序集与共享程序集的区别?
A:私有程序集是一种最简单的程序集类型。私有程序集一般附带在某个软件上,且只能用于该软件。
共享程序集是其他应用程序可以使用的公共库。
私有程序集完全是自包含的,只需把相应文件放在文件系统中对于文件夹即可(不需要注册表项),这个过程成为0影响安装。
Q:什么是反射技术?
A:因为程序集存储了元数据,包括在程序集中定义的所有类型和这些类型的成员的细节,所以可以编程访问这些元数据。这种技术成为反射。
五、名称空间
Q:什么是名称空间?
A:名称空间不过是数据类型的一种组合形式,但名称空间中所有数据类型的名称都会自动加上该名称空间的名字作为其前缀。
六、小结
这是我读完第一章的一些笔记,如果有哪些不正确的地方,还请大家指出。