- new()一个类型的步骤
- 计算类型及其基类所定义字段和开销成员(类型对象指针、同步块索引)的字节
- 托管堆分配需要的字节
- 初始化类型对象指针、同步块索引
- 最后调用类型实例构造器,传递new的参数
类型转换
- 通过is进行类型判断、显示转换可以通过(TypeName)转换,但是一般使用as 可以提高性能
命名空间和程序集
- 命名空间和程序集是不相关的。e.g. System.IO.FileSystem和System.IO.FileSystemWatcher是在不同的程序集实现的
运行时的相互关系
-
栈帧
代表线程调用栈中一个方法的调用,每调用一个方法都会创建一个栈帧
并压入
- 任何时候在
堆上新建对象
,都会自动初始化其中的类型对象指针
指向类型对象
。
-
类型对象
上包含类型对象指针
、同步块索引
、静态字段
、方法表
等。
- 这时发现
类型对象
里面也有类型对象指针
,这个指针指向System.Type类型对象
,并且Type类型对象得类型对象指针指向自身
-
调用实例非虚方法时
,会找到对应的实例对象的类型对象
,如果没有找到对应的方法,将会一直回溯到Object,每个类型对象
都有一个字段引用基类型,然后JIT会查找方法的记录项,如果需要就进行编译然后再调用。
-
调用虚方法时
会生成一些代码,每次调用虚方法都要执行这些代码。这些代码的操作和上面调用非虚方法一样。(但是之前看到过说调用虚方法有性能开销,目前还不清楚为什么?)