所有类型都从System.Object派生
Object类型的公开方法
Equals、GetHashCode、GetType、ToString
Object类型的受保护方法
MembervieseClone、Finalize
new操作符所做的事情
1.它计算类型和它的所有基类中定义所有字段需要的字节数
2.它从托管堆中分配指定类型要求的字节数,从而分配对象的内存,分配的所有字节都设为零
3.初始化对象的成员
4.调用类型的构造函数
5.返回新建对象的引用
类型转换
CLR允许将一个对象转换成它的(实际)类型或者它的任何基类型
向基类型转换是一种安全的隐式转换,然而将其转换成派生类时则需要显式地转换
使用C#的is和as操作符来转型
is检查一个对象是否兼容于指定的类型,并返回一个bool值,is操作符永远不会抛出异常
使用as操作符,则CLR检查类型可以减少检查一次,提高系统的性能
as操作符的工作方式与强制类型转换一样,如果不能转换,则返回一个null
命名空间和程序集不一定是相关的
运行时的相互联系
类型、对象、线程栈和托管堆
栈是从高位内存地址到低位内存地址构建的
调用一个方法时,还会将一个"返回地址"压入栈,被调用的方法结束之后,应该返回这个位置
将数据存放于堆中
检查内部所有的引用类型,确保对应的程序集被加载,通过程序集中的元数据,CLR会提取这些类型的相关信息,并创建一些结构表示类型本身,并存放于堆中
堆上的所有对象都包含两个额外的成员:类型对象指针和同步块索引
调用一个非虚实例方法时,JIT编译器会查询该类型中的方法表,如果没有找到,则会向上查询,查询该类型的基类是否包含这个方法,一直找到Object类型
调用一个虚方法时,JIT编译器会生成额外的代码,通过这些代码检查发出调用的变量,代码检查类型对象指针,这个成员指向对象的实际类型,在该类型对象中查找调用的方法