CLR via C# 阅读笔记
1.char在C#中为16位Unicode字符;int 映射到System.Int32;long映射到System.Int64。
2.重载时C#不考虑返回值,而CLR允许返回值不同,方法名和参数相同的重载。
3.callvirt调用方法时会验证变量是否为NULL,如果是则无法判断变量的实际类型从而抛出异常,因此callvirt执行速度比call慢。对于引用类型,C#编译器通常使用call调用静态方法,使用callvirt调用实例方法和虚方法(在重载方法中调用父类的虚方法,该方法调用会编译成call,否则将会递归调用本身造成栈溢出)。对于值类型,编译器倾向于使用call,因为值类型都是密封的,且永远不为null。
4.可以通过反射修改只读字段。
5.抽象类的默认构造器为protected,静态类在元数据中是static and sealed.
6.值类型没有默认的无参构造器,且C#不允许显式声明无参构造器,显式声明的构造器必须被显式调用
7.编译器根据属性的get set生成相应的方法,以及元数据的一个属性定义。简单的get set方法会内联到所调用的方法里以避免调用的开销。
8.事件编译时生成一个委托类型的字段,以及封装了delegate的combine,remove方法的add_xx,move_xx方法,以及元数据中的事件记录项。
9.对含有泛型的类型参数的方法进行JIT编译时,引用类型参数可以互相共享代码,因为引用类型的参数都是指向堆上的指针。
10.string的Format方法会调用每个对象的ToString方法获取对象的字符串表示,然后拼接在一起返回完整的字符串。
11.拆箱不是装箱的逆过程,而是获得指向包含在装箱对象中原始值类型的指针。拆箱不会在内存中复制,所以代价远小于装箱,但是拆箱之后往往紧接着一次复制操作。
12.Delegate类有两个公共属性:Target返回私有字段_target,如果委托包装的是静态方法则为null,实例方法则为回调方法要操作的对象;Method返回_methodPtr转换成的MethodInfo对象,_methodPtr标识要回调的方法。
13.JIT编译方法时,会检查代码引用了哪些类型,并检查对于当前AppDomain是否已经执行类型构造器初始化类型。JIT编译器可以选择两种形式对静态构造器进行调用:刚好在创建类型的第一个实例前(Precise);在首次访问静态字段或静态/实例方法,或是实例构造器前,随便一个时间调用(BeforeFieldInit)。第二种为首选,如果一个类包含显式静态构造器,则不会添加BeforeFieldInit元数据标记。
14.对象的类型对象指针指向它的类型对象,而它的类型对象的类型对象指针指向System.ValueType,System.ValueType的类型对象指针指向自己(类型对象在Loader堆上)。
15.进程初始化时,CLR所保留的一块地址空间即为托管堆,托管堆维护一个NextObjPtr指针指向下一个对象在堆中的位置。托管堆中连续创建的对象的内存分配是连续的。
16.如果创建新对象时该对象定义了 Finalize方法,该对象的一个指针将会添加到 finalization list(从System.Object继承的除外),GC开始时该对象指针将从 finalization list转移到freachable队列。之后一个高优先级的CLR线程专门负责调用Finalize方法。下一次GC开始后,这些对象会被回收。
17.finalize不能显式调用,实现IDisposible的Disposible方法可以显示进行资源清理(Disposible方法中应调用GC的静态方法SupressFinalize,阻止CLR将对象指针从 finalization list转移到freachable队列,从而阻止对象"活到下一次GC")。
CLR via C# 阅读笔记的更多相关文章
- CLR via C#学习笔记----知识总概括
第1章 CLR的执行模型 托管模块的各个组成部分:PE32或PE32+头,CLR头,元数据,IL(中间语言)代码. 高级语言通常只公开了CLR的所有功能的一个子集.然而,IL汇编语言允许开发人员访问C ...
- 《C#程序设计教程 -李春保》阅读笔记
<C#程序设计教程 -李春保>阅读笔记 ( 需注意程度:红>粗体>下划线,蓝色:我的疑问 ) 老师的引言 [师]对待一种新语言的关注点 数据类型定义(python不用定 ...
- 阅读笔记 1 火球 UML大战需求分析
伴随着七天国庆的结束,紧张的学习生活也开始了,首先声明,阅读笔记随着我不断地阅读进度会慢慢更新,而不是一次性的写完,所以会重复的编辑.对于我选的这本 <火球 UML大战需求分析>,首先 ...
- [阅读笔记]Software optimization resources
http://www.agner.org/optimize/#manuals 阅读笔记Optimizing software in C++ 7. The efficiency of differe ...
- 《uml大战需求分析》阅读笔记05
<uml大战需求分析>阅读笔记05 这次我主要阅读了这本书的第九十章,通过看这章的知识了解了不少的知识开发某系统的重要前提是:这个系统有谁在用?这些人通过这个系统能做什么事? 一般搞清楚这 ...
- <<UML大战需求分析>>阅读笔记(2)
<<UML大战需求分析>>阅读笔记(2)> 此次读了uml大战需求分析的第三四章,我发现这本书讲的特别的好,由于这学期正在学习设计模式这本书,这本书就讲究对uml图的利用 ...
- uml大战需求分析阅读笔记01
<<UML大战需求分析>>阅读笔记(1) 刚读了uml大战需求分析的第一二章,读了这些内容之后,令我深有感触.以前学习uml这门课的时候,并没有好好学,那时我认为这门课并没有什 ...
- Hadoop阅读笔记(七)——代理模式
关于Hadoop已经小记了六篇,<Hadoop实战>也已经翻完7章.仔细想想,这么好的一个框架,不能只是流于应用层面,跑跑数据排序.单表链接等,想得其精髓,还需深入内部. 按照<Ha ...
- Hadoop阅读笔记(六)——洞悉Hadoop序列化机制Writable
酒,是个好东西,前提要适量.今天参加了公司的年会,主题就是吃.喝.吹,除了那些天生话唠外,大部分人需要加点酒来作催化剂,让一个平时沉默寡言的码农也能成为一个喷子!在大家推杯换盏之际,难免一些画面浮现脑 ...
随机推荐
- wikioi1688 求逆序对
题目描述 Description 给定一个序列a1,a2,…,an,如果存在i<j并且ai>aj,那么我们称之为逆序对,求逆序对的数目 数据范围:N<=105.Ai<=105. ...
- 【HDU】4092 Nice boat(多校第四场1006) ——线段树 懒惰标记
Nice boat Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) To ...
- MongoDB C driver API continues
开篇前 <1,mongoc_init() func> mongoc_init() Synopsis void mongoc_init (void); Description This fu ...
- Ruiy classicsQuotations
1,IT界,许多人会称自己为菜鸟,而每只菜鸟都会有鹰的梦想; 2,把做十件事精力用来做一件事情,你事业就经典了;
- OpenSuSE查看指定软件包是否安装(OpenSuSE使用RPM作为默认的软件包维护管理工具)
suse 是 zypper se xxxxx 是搜索软件包 (查看已经安装的 软件包是否已经安装)
- hdu 4711 Weather概率dp
http://acm.hdu.edu.cn/showproblem.php?pid=4711 真的是坑吐血了,wa了5次 最后实在无语 把long long double 改成long double ...
- 使用StoryBoard设置Scrollview的横向滚动不用一行代码
1).创建一个空工程Single类型的工程,然后打开故事版(StoryBoard)在ViewController上添加scrollview 2).然后对scrollview添加约束,上下左右全部都是0 ...
- 委托-异步调用-泛型委托-匿名方法-Lambda表达式-事件【转】
1. 委托 From: http://www.cnblogs.com/daxnet/archive/2008/11/08/1687014.html 类是对象的抽象,而委托则可以看成是函数的抽象.一个委 ...
- zabbix client安装配置执行
1 创建zabbix 用户 groupadd zabbix; useradd -g zabbix zabbix; passwd zabbix; 两次输入password 2 下载获得zabbix的包, ...
- 深入理解JVM : Java垃圾收集器
如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现. Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商.不同版本的虚拟机所提供的垃圾收集器都可能会有很大差 ...