内容提要:

(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. JS数组常用方法

      // 来自 http://www.runoob.com/jsref/jsref-obj-array.html   var arr01 = [ "fuc" , "shi ...

  2. zabbix log(logrt) key的使用

    今天看了篇帖子是关于如何利用zabbix 自带的key去读log,监控linux异常登陆,一直以来都是自己写脚本去读log的.就想看看这个zabbix log 这个key怎么样..好吧开始: 官方文档 ...

  3. Oracle数据库之创建表空间与用户

    Oracle数据库之创建表空间与用户 一.创建表空间 基本语法表述: CREATE TABLESPACE tablespace_name [DATAFILE datafile_spec1 [,data ...

  4. php.ini的中文解释

    [PHP]  ; PHP还是一个不断发展的工具,其功能还在不断地删减  ; 而php.ini的设置更改可以反映出相当的变化,  ; 在使用新的PHP版本前,研究一下php.ini会有好处的 ;;;;; ...

  5. PHP防止SQL注入的方法

    [一.在服务器端配置] 安全,PHP代码编写是一方面,PHP的配置更是非常关键. 我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最 ...

  6. cocos2d-js 入门之碰撞

    本文由qinning199原创,转载请注明:http://www.cocos2dx.net/post/223 1.cc.rectIntersectsRect(ra,rb) 判断两个矩形是否相交,若相交 ...

  7. NET MVC+EF6+Bootstrap

    开源:ASP.NET MVC+EF6+Bootstrap开发框架   前言 我在博客园潜水两三年了,在这里看过很多大神的文章,也学到了很多东西.可以说我是汲取着博客园的营养成长的. 想当年,我也是拿1 ...

  8. Ubuntu12.04 下安装QQ

    1:点此下载DEB安装包http://www.longene.org/download/WineQQ2012-20120712-Longene.deb 2:打开终端输入到目录中运行命令安装. sudo ...

  9. 通过MYSQL命令行直接建数据库

    因为同事要求,在进行MYSQLDUMP的导入库时,加一个日期标签, BUT,MYSQLDUMP的前提是数据库中要存在数据库名, 于是通过-e 参数执行命令. 这让我想起了前不久请教同事,如果AWK传变 ...

  10. squid+stunnel+用户密码认证的三种玩法

    没办法,应用越来越深入,就会越来越多要求. squid+stunnel+用户密码认证的场景至少以下三个,我会遇到. 1,标准玩法 在服务器上建一个SQUID,加密码认证,然后,其它人通过它上网.(不要 ...