内容提要:

(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:私有程序集是一种最简单的程序集类型。私有程序集一般附带在某个软件上,且只能用于该软件。

共享程序集是其他应用程序可以使用的公共库。

(1)为解决名称冲突和程序集不同版本之间的覆盖问题,我们把共享程序集放在一个特定的子目录树中,这个子目录树称为全局程序集缓存(GAC,Global Assembly Cache)
 
(2)为了避免名称冲突,应根据私钥加密法为共享程序集指定一个名称,该名称称为强名(strong name),并保证唯一性,它必须由要引用共享程序集的应用程序来引用。

私有程序集完全是自包含的,只需把相应文件放在文件系统中对于文件夹即可(不需要注册表项),这个过程成为0影响安装。

Q:什么是反射技术?

A:因为程序集存储了元数据,包括在程序集中定义的所有类型和这些类型的成员的细节,所以可以编程访问这些元数据。这种技术成为反射。

五、名称空间

Q:什么是名称空间?

A:名称空间不过是数据类型的一种组合形式,但名称空间中所有数据类型的名称都会自动加上该名称空间的名字作为其前缀。

六、小结

这是我读完第一章的一些笔记,如果有哪些不正确的地方,还请大家指出。

C#高级编程第1章-.NET体系结构的更多相关文章

  1. ASP.NET MVC5 高级编程 第5章 表单和HTML辅助方法

    参考资料<ASP.NET MVC5 高级编程>第5版 第5章 表单和HTML辅助方法 5.1 表单的使用 5.1.1 action 和 method 特性 默认情况下,表单发送的是 HTT ...

  2. ASP.NET MVC5 高级编程 第3章 视图

    参考资料<ASP.NET MVC5 高级编程>第5版 第3章 视图 3.1 视图的作用 视图的职责是向用户提供界面. 不像基于文件的框架,ASP.NET Web Forms 和PHP ,视 ...

  3. ASP.NET MVC5 高级编程 第2章 控制器

    参考资料<ASP.NET MVC5 高级编程>第5版 第2章 控制器 控制器:响应用户的HTTP 请求,并将处理的信息返回给浏览器. 2.1 ASP.NET MVC 简介 MVC 模式中的 ...

  4. 【读书笔记】C#高级编程(一).NET体系结构

    写在前面:从业两年来,一直停留在会用的阶段,而没有去仔细思考过为什么这么用,之前也大致扫过<c#高级编程>一书,这次想借一袭脑海中的冲动,再次好好仔细过过这本书,夯实基础,温故知新. 一. ...

  5. C#高级编程第2章-核心C#

    内容提要: 声明变量:变量的初始化和作用域:C#的预定义数据类型:在C#程序中使用条件语句.循环和跳转语句指定执行流:枚举:名称空间: Main()方法:基本命令行C#编译器选项:使用System.C ...

  6. UNIX环境高级编程 第13章 守护进程

    守护进程daemon是一种生存周期很长的进程.它们通常在系统引导时启动,在系统关闭时终止.守护进程是没有终端的,它们一直在后台运行. 守护进程的特征 在Linux系统中,可以通过命令 ps -efj ...

  7. UNIX环境高级编程 第8章 进程控制

    本章是UNIX系统中进程控制原语,包括进程创建.执行新程序.进程终止,另外还会对进程的属性加以说明,包括进程ID.实际/有效用户ID. 进程标识 每个进程某一时刻在系统中都是独一无二的,它们之间是用一 ...

  8. UNIX环境高级编程 第7章 进程环境

    本章涉及C/C++程序中main函数是如何被调用的.命令行参数如何传递给main函数.程序的内存空间布局.程序如何使用环境变量.程序如何终止退出. main函数 C程序或C++程序总是从main函数开 ...

  9. UNIX环境高级编程 第5章 标准I/O库

    本章是关于C语言标准I/O库的,之所以在UNIX类系统的编程中会介绍C语言标准库,主要是因为UNIX和C之间具有密不可分的关系.由于UNIX系统存在很多实现,而每个实现都有自己的标准I/O库,为了统一 ...

随机推荐

  1. oracle单行函数之字符函数

    Lower--转换为小写 upper--转换为大写 Initcap--首字母大写 concat--连接字符 substr--截取字符 length/length--获取字符串长度(字节长度) inst ...

  2. 取消IDEA中光标“指哪打哪”模式

    很简单,在Settings->Editor里面去掉Allow placement of caret after end of line

  3. jQuery的map()与jQuery.map()总结

    请注意他们不是同一个函数.前者是jQuery对象的实例方法(即$.fn.map),后者是一个仅仅挂在jQuery对象下的静态方法(即$.map). 他们用法的异同:map()的返回值是包裹了一个Arr ...

  4. 找不到请求的 .Net Framework Data Provider。可能没有安装。

    解决方法: 安装Microsoft SQL Server Compact 4.0. 安装Microsoft SQL Server Compact 4.0之后,程序运行正常. 问题的原因就是程序连接.s ...

  5. 转:DSP学习经验

    转载:http://www.cnblogs.com/MrYang/archive/2010/12/21/1913035.html

  6. Cisco C2900XL

    http://docstore.mik.ua/univercd/cc/td/doc/product/lan/c2900xl/c2900sa4/sa4cr/macintr.htm#xtocid10160 ...

  7. C 語言中的編譯指示 (Pragma)

    編譯指示 #pragma 是用來告知編譯器某些特殊指示,例如不要輸出錯誤訊息,抑制警告訊息,或者加上記憶體漏洞檢查機制等.這些指示通常不是標準的 C 語言所具備的,而是各家編譯器廠商或開發者所制定的, ...

  8. 18个SaaS及其功能评价

    SAAS软件及其功能评价1. 360 两个同步功能都不错,却被埋没了2. 够快云3. DBFen4. Seafile5. 坚果云6. DZ7. 百度云8. 1159. 迷你云10. 微云11. Dro ...

  9. iOS 9之3D Touch

    金田 北京时间9月10日凌晨, Apple在美国旧金山比尔格拉汉姆公民大礼堂(Bill Graham Civic Auditorium)召开新品发布会.本次着重介绍了3D Touch功能, 大体介绍一 ...

  10. Android软件的国际化

    软件的国际化指的就是:在不同语言的环境的操作系统下,显示不同的语言 2 其实实现软件的国际化很简单: 3 4 1.如果是对文字的国际化,只需要在res文件夹下面建立如下文件夹: 5 values-zh ...