解读经典-《C#高级编程》第七版-Chapter1-.Net体系结构-Page6-13
01
中间语言(IL)
.Net中间语言(IL)的特性,很大程度上来自于要支持多语言互操作性。要支持多语言互操作性,是因为微软想搞一个大事情,将它的老产品线VB和VC++,VJ++都装入.Net架构中。要支持多语言互操作,就需要实现这些基本功能:
1) 继承:一种语言的类能继承另一种语言编写的类。
2) 组合:一种语言的类可以包含另外一种语言的类的实例。
3) 调用:一个对象能够调用其他语言编写的对象的方法。
4) 传递:值和对象应该能在不同类的方法之间传递(传递数据)。
5) 调试:调试器应能支持跨语言调试。
这里特别说明下:继承和组合。我们在学习所谓的“面向对象”的编程的时候,往往会用力过度,觉得对象化编程关键是“继承”,然后就设计出一堆继承关系。然而你要提醒自己,“组合”才是你应该多用的,因为继承观念虽好,但它有限制且复杂,因为.Net,Java是单一继承,而C++的多继承又特别复杂,概念虽美,但我们的目标是:更高效的写代码。举个例子,当你考虑B类继承A类时,考虑一下:B类包含A类,如何?这例子可以类比为:当你要继承你爸爸时,你考虑下,你包含你爸爸和你妈妈?我觉得后者更合适。因为你还要继承你妈妈,所以单一继承你爸爸不合适,而且你还会有你爸爸没有的技能,所以用包含挺好。
回到话题,上述如此宏伟的规划,.Net实现了。这就需要中间语言要提供强力支持。很显然我们可以想到,中间语言必须有相当程度的“对象化”特性,才能很好的支持这一点。我们来看看它的特征:
1) 面对对象和使用接口
面对对象相当于为不同语言建立了底层的“基本对象”,使不同语言有了相同的底层基础。使用接口使得不同语言可以遵循统一的“契约”(接口即契约)。
2) 区分值类型和引用类型
与其他编程语言一样,中间语言提供了预定义的基本数据类型。它分为值类型和引用类型,值类型存储在堆上,引用类型的实例则存储在堆栈上,堆和堆栈是两种不同的内存区域。
3) 强数据类型化
强数据类型化非常重要,它使得在不同语言间的数据传递变得简单而高效。中间语言通过“通用类型系统(CTS)”来预定义通用类型,通过“公共语言规范(CLS)”来确保语言的互操作性。
强数据类型化也使得中间语言可以实现对象化管理,从而实现了.Net的垃圾回收机制。中间语言通过“托管堆”存储对象,当托管堆满时调用垃圾回收器清理对象。
“应用程序域”也是个.Net的一个重要特性,传统的应用程序通过COM进行组件调用,此时应用程序和组件使用的是同一块内存,这容易因为COM组件的Bug而导致整个应用程序崩溃。而传统的通过比如CGI进程的方式来隔离内存,又存在进程开销比较大,进程间数据交换效率低的问题。而应用程序域很好的解决了这个问题。这依赖于中间语言的“强数据类型化”,强数据类型化隔绝了对内存的跨域访问,以及通过强类型化,使得数据可以以“对象”的方式传输,极大的提高了数据交换性能。当然应用程序域很少被应用,我自己几乎没用到,一般只在做类似开发工具Eclipse之类的插件式应用时才需要考虑。
4) 使用异常来处理错误
因为运行在中间语言之上的高级语言都使用了异常处理机制,所以中间语言需要支持异常的基础结构,使得异常能够在不同语言间传递必要的调试数据信息。
同Java一样,异常在C#中非常重要。因为历史原因,程序员们看到太多的代码都是使用更老旧的语言编写的,比如C,C++等,在这些传统语言中,一般使用方法的返回值来表示错误,比如返回-1表示错误类型1,返回-2表示错误类型2。这在.Net时代已经过时,我看到太多的人在错误的使用异常机制,还在走老旧的错误处理方式。这真是埋没了.Net优秀的异常机制,也是给自己编程挖坑的典范。记住一句话:你压根儿不应该在.Net框架下,考虑用返回值来表示错误!如果你发现在这么想,那么应该立即反省和思考。.Net下的返回值,只需要用于真正要返回的值,如果你的方法没有想要返回的值,那么方法的返回值就应该是void。
5) 使用特性(attribute)
中间语言也支持特性。在传统的C++编写COM时会使用特性,它一般是用于给编译器提供一些额外的信息。中间语言对特性进行了功能的拓展。我们可以自定义特性,可以使用反射来应用特性。这在ASP.Net MVC中体现的非常多,它实现了“面向切面编程”,使得代码能得到更好的复用。
后面将继续讲述“程序集”,“名称空间”等中间语言特性。
我们下回分解。
欢迎关注本人微信公众号,更及时的关注最新文章(每周三篇原创文章,以及多篇专题文章):
附文:
上一篇:解读经典-《C#高级编程》第七版-Chapter1-.Net体系结构-Page1-6
解读经典-《C#高级编程》第七版-Chapter1-.Net体系结构-Page6-13的更多相关文章
- c#高级编程第七版 学习笔记 第一章 .NET体系结构
第一章 .NET体系结构 本章内容: 编译和运行面向.NET的代码 Microsoft中间语言(Microsoft Intermediate Language,MSIL或简称IL)的优点 值 ...
- c#高级编程第七版 学习笔记 第二章 核心c#
第二章 核心C# 本章内容: 声明变量 变量的初始化和作用域 C#的预定义数据类型 在c#程序中使用条件语句.循环和跳转语句执行流 枚举 名称空间 Main()方法 基本的命令行c#编译器选项 使用S ...
- c#高级编程第七版 学习笔记 第三章 对象和类型
第三章 对象和类型 本章的内容: 类和结构的区别 类成员 按值和按引用传送参数 方法重载 构造函数和静态构造函数 只读字段 部分类 静态类 Object类,其他类型都从该类派生而来 3.1 类和结构 ...
- ASP.NET MVC 4高级编程(第4版)
<ASP.NET MVC 4高级编程(第4版)> 基本信息 作者: (美)Jon Galloway Phil Haack Brad Wilson K. Scott All ...
- 《UNIX环境高级编程(第3版)》
<UNIX环境高级编程(第3版)> 基本信息 原书名:Advanced Programming in the UNIX Environment (3rd Edition) (Addison ...
- 【转】apue《UNIX环境高级编程第三版》第一章答案详解
原文网址:http://blog.csdn.net/hubbybob1/article/details/40859835 大家好,从这周开始学习apue<UNIX环境高级编程第三版>,在此 ...
- Linux - Unix环境高级编程(第三版) 代码编译
Unix环境高级编程(第三版) 代码编译 本文地址:http://blog.csdn.net/caroline_wendy 时间:2014.10.2 1. 下载代码:http://www.apuebo ...
- Unix环境高级编程第三版中实例代码如何在自己的linux上运行的问题
学习Linux已经有2个月了,最近被期末考试把进度耽误了,前几天把Unix环境高级编程看了两章,感觉对Linux的整体有了一些思路,今天尝试着对第一章涉及到的一个简单的交互式shell编译运行一下,结 ...
- C#高级编程 (第六版) 学习 第七章:委托和事件
第七章 委托和事件 回调(callback)函数是Windows编程的一个重要方面,实际上是方法调用的指针,也称为函数指针. .Net以委托的形式实现了函数指针的概念,.Net的委托是类型安全的. 委 ...
- C#高级编程第11版 - 第七章 索引
[1]7.1 相同类型的多个对象 1.假如你需要处理同一类型的多个对象,你可以使用集合或者数组. 2.如果你想使用不同类型的不同对象,你最好将它们组合成class.struct或者元组. [2]7.2 ...
随机推荐
- 5随机到7随机的C++实现
一.5随机到7随机 //给定条件 int Rand1To5(){ + ; } //实现代码,使用插空法和筛的过程 int Rand1To7(){ ; do{ tmp = (Rand1To5() - ) ...
- java实现四则运算
http://blog.csdn.net/lip009/article/details/7768258 我之前找到的一个大神写的?还没看懂
- gitlab 之 升级、迁移
-----故事背景- 公司服务器用vm装的虚拟机,由于公司服务器经常无故重启,且找不到原因,所以公司准备将vm迁移至Hyper-V,Hyper-V可以自启动虚拟机且免费. -----升级.迁移- 首先 ...
- IDEA的Database表的基本操作
1.创建表 方法一:直接创建:右键-new-table 方法2: 参考别的表,直接用语句,右键-DDL and Sources- 然后直接在控制台修改 修改后直接运行,表就建好了 2.备份表 先用上面 ...
- Ubuntu允许root远程登录配置
1.背景 近期在本地的虚拟机VMware上安装了Ubuntu Server 17.04,由于系统是无界面的,所有操作都需要通过Linux命令进行操作.后来不想直接在服务器上操作,想通过远程工具Xshe ...
- CCS3怎么实现border边框渐变效果
下图注册按钮的边框有渐变效果,如果让你来实现,你会怎么做呢 个人觉得,省事的做法,直接让UI给背景图片就可以了,如下图 不过这种做法感觉不太灵活,如果要修改border的渐变颜色,就需要UI重新做图. ...
- ansible中include_tasks和import_tasks
简介 本文主要总结下ansible里task调用的方法有哪些和它们的主要区别 随着要管理的服务不断增多,我们又没将task放到roles里,会发现playbook文件越来越大,内容也越来越多,管理起 ...
- python常用的十进制、16进制之间的转换
一 整数之间的进制转换: hex(16) # 10进制转16进制 oct(8) # 10进制转8进制 bin(8) # 10进制转2进制 二 字符串转整数 int(') # 字符串转换成10进制整数 ...
- ubuntu双网卡配置,实现内网外网同时访问!
我们假定内网IP为:10.35.0.58,内网网关为:10.35.0.254:外网IP为222.76.250.4,外网网关为:222.76.250.1.其中局域名网需要连接:10.35.0.X,10. ...
- tensorflow笔记4:函数:tf.assign()、tf.assign_add()、tf.identity()、tf.control_dependencies()
函数原型: tf.assign(ref, value, validate_shape=None, use_locking=None, name=None) Defined in tensorflo ...