第四章 类型基础

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编译器会生成一些额外的代码,这些代码首先检查发出调用的变量,然后跟随地址找到调用的对象,然后代码检查对象内部的类型对象指针成员,这个成员指向对象的实际类型,然后再找到的类型对象中查找方法的记录项.

原文地址:https://www.cnblogs.com/zhangliming/p/3447459.html