最近开始仔细研读《CLR.via.C#第三版》这本书。读pdf文档确实很累。建议有条件的朋友还是买书看吧。

我的笔记用来记录我对这本书的理解,简化下逻辑,对每个部分我觉得是要点的进行归纳总结。特别基础的东西不会做过多的阐述。

第一部分讲的是CLR基础。

首先还是重新说下CLR的概念:“CLR 是一个可由多种编程语言使用的“运行时”。可用任何编程语言来开发代码,只要编译器是面向CLR的就可以了”。这里要重新解释下“只要编译器是面向CLR的就可以了”这句话。初学者一般不认同.net平台跨语言,或者说所谓的“跨语言”是在微软推出的范围内的语言。这个认识其实是错误的。任何语言都可以面向CLR来创建自己的编译器。我们熟知的Iron Ruby、Perl、PHP都有面向CLR的编译器。图1-1展示了编译源代码文件的过程。

比较重要的认知是CLR实际不和托管模块一起工作,而是和程序集一起工作。程序集包含了托管模块和资源文件等其它文件。

IL(中间语言)可以使用汇编语言来写。CLR中的JIT(just in time)也叫即时编译器,里面有个函数JITComplier(),此函数的职责是把要执行的方法的IL转换成本地CPU指令。

类中方法的调用过程:

一个方法执行的时候总的来说会被调用两次。(这里暂定方法名为Test())

第一次调用:

JITCompiler()会把Test()方法的IL代码编译成本地CPU指令(此指令会被保存到一个动态分配的内存块中),Test()方法在内存块中会通过JITComplier执行一遍(包括查找方法的IL,验证方法的IL,编译,执行)。

第二次调用:

完全跳过JITCompiler(),Test()方法在内存中再执行一遍。

两次执行的过程如图1-4,1-5所示:

需要注意的是本地CPU指令是存储到动态内存中的,一旦程序终止,本地CPU指令将会被丢弃。

Debug版本和Release版本的区别本质上是IL代码质量和JIT本地代码质量是否经过优化。从性能上考虑,程序部署、发布,最好是用Release版本。

这个部分还有程序打包、部署、程序集信息等内容。这里就不阐述了。

《CLR.via.C#第三版》第一部分读书笔记(一)的更多相关文章

  1. 《JavaScript面向对象编程指南(第2版)》读书笔记(一)

    目录 一.对象 1.1 获取属性值的方式 1.2 获取动态生成的属性的值 二.数组 2.1 检测是否为数组 2.2 增加数组长度导致未赋值的位置为undefined 2.3 用闭包实现简易迭代器 三. ...

  2. 《JavaScript面向对象编程指南(第2版)》读书笔记(二)

    <JavaScript面向对象编程指南(第2版)>读书笔记(一) <JavaScript面向对象编程指南(第2版)>读书笔记(二) 目录 一.基本类型 1.1 字符串 1.2 ...

  3. 6 Specialzed layers 特殊层 第一部分 读书笔记

    6 Specialzed layers 特殊层  第一部分  读书笔记   Specialization is a feature of every complex organization. 专注是 ...

  4. 《CLR.via.C#第三版》第二部分第8,9章节读书笔记(四)

    三种类型的构造方法: 实例构造器(引用类型):实例构造器永远不能被继承(所以方法前没有修饰符):如果类的修饰符为static(sealed和abstract),编译器根本不会在类的定义中生成一个默认构 ...

  5. 《CLR.via.C#第三版》第二部分第4,5章节读书笔记(二)

    这两章全是理论性的东西,我觉得不必过于钻牛角尖.理论这东西,只有在长期的实践中去慢慢领悟才会深刻.下面我只写些我认为重要的关键知识. (一)类型转换 知识点:向基类型的转换被认为是一种安全的隐式转换: ...

  6. CLR.via.C#第三版 读书笔记

    第一章 CLR的执行模型 1.1将源代码编译成托管代码 决定将.NET Framework作为自己的开发平台之后,第一步是决定要生成什么类型的应用程序或组件.假定你已经完成了这些次要的细节:一切都已经 ...

  7. Java 线程第三版 第一章Thread导论、 第二章Thread的创建与管理读书笔记

    第一章 Thread导论 为何要用Thread ? 非堵塞I/O      I/O多路技术      轮询(polling)      信号 警告(Alarm)和定时器(Timer) 独立的任务(Ta ...

  8. Java 螺纹第三版 第一章Thread介绍、 第二章Thread创建和管理学习笔记

    第一章 Thread导论 为何要用Thread ? 非堵塞I/O      I/O多路技术      轮询(polling)      信号 警告(Alarm)和定时器(Timer) 独立的任务(Ta ...

  9. python全栈开放实践第三版第一章的练习题完成情况

    练习题: 1.简述编译型与解释型语言的区别,且分别列出你知道哪些语言属于编译型,哪些数以解释型.1 编译型:只须编译一次就可以把源代码编译成机器语言,后面的执行无须重新编译,直接使用之前的编译结果就可 ...

随机推荐

  1. FIFO

    FIFO存储器 FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序 ...

  2. 在Xcode中使用Git进行源码版本控制

    http://www.cocoachina.com/ios/20140524/8536.html 资讯 论坛 代码 工具 招聘 CVP 外快 博客new 登录| 注册   iOS开发 Swift Ap ...

  3. CodeSmith Generator 7.0.2激活步骤

    地址是:http://www.cnblogs.com/dunitian/p/4096917.html

  4. Sql日期时间格式转换

    sql server2000中使用convert来取得datetime数据类型样式(全) 日期数据格式的处理,两个示例: CONVERT(varchar(16), 时间一, 20) 结果:2007-0 ...

  5. .net走向设计2—设计工具

    1.思维导图 2.项目管理工具 3.常用UML工具 4.数据库设计工具

  6. mysql 乱码问题(程序界面显示正常,mysql command line显示乱码)

    今天用java写一个程序,用的是mysql数据库.界面出现乱码,然后写了一个过滤器结果了乱码问题. 但是,当我在mysql command line 中查询数据的时候,在界面上显示正常的数据,在mys ...

  7. map阶段动态获取CombineTextInputFormat各输入文件路径

    老mr程序中map中conf的map.input.file参数只能获取获取CombineTextInputFormat的第一个输入文件,而新版mr程序则连第一个输入文件也无法获取,这是因为create ...

  8. yii 图片展示

    <?= DetailView::widget([ 'model' => $model, 'attributes' => [ 'id', 'name', 'time', 'pic', ...

  9. java excle导出合计字段值

    效果图: 代码实现: 解释: // 四个参数分别是:起始行,起始列,结束行,结束列 sheet.addMergedRegion(new Region(0, (short) (celln + 1), 0 ...

  10. 使用hibernate可以优化的地方

    a.  在查询字符串中,应该总是使用jdbc的占位符?,或使用使用命名参数:,不要自查询中使用字符串值来代替非常量值. b.  Flush会影响性能,频繁刷新影响性能,尽量减少不必要的刷新. c.   ...