第四章 类型基础
1. 所有类型都继承自System.Object
object的GetType方法是非虚方法,防止基类重写此方法,破坏类型安全性.
Var test=new Test(“test”)
创建对象时所进行的操作:
1. 计算类型及所有基类型中定义的实例字段字节数,以及”类型对象指针”和”同步块索引”.
2. 从托管对中分配计算的字节数,所有字节设为零(0).
3. 初始化”类型对象指针”和”同步块索引”.
4. 调用实例构造函数,传入参数.
2. 类型装换
if(0 is Employee){ var e=(Employee)o; }
var e=o as Employee;
if(null!=e){
}
第一中用法要进行两次的类型检查.第二种只进行一次的类型检查.效率要高一些.
3. 运行时的相互联系
类型对象:包含静态字段和方法表,以及类型对象指针,同步块索引.类型对象是System.Type类型的实例.类型对象中的类型对象指针指向System.Type.
System.Type类型对象本身也有一个类型对象指针,而且他的类型对象指针指向自己.
System.Object.GetType方法返回的是存储在指定对象的”类型对象指针”成员中的地址.
在调用静态方法时,CLR会定位与定义静态方法的类型的类型对象,然后再类型对象的方法表中查找对应的记录项.
在调用非虚实例方法时,JIT编译器会找到与”发出调用的那个变量的那个变量类型”对应的类型对象,然后再其本身及其基类的方法表中查找此方法的记录项.
在调用虚实例方法时,JIt编译器会生成一些额外的代码,这些代码首先检查发出调用的变量,然后跟随地址找到调用的对象,然后代码检查对象内部的类型对象指针成员,这个成员指向对象的实际类型,然后再找到的类型对象中查找方法的记录项.