C#类型基础(1)
1、“运行时”要求每个类型最终都从 System.Object 类型派生。
Object提供了Equals,GetHashCode,ToString,GetType公共方法,并提供MemberwiseClone、Finalize的保护方法。
2、CLR 要求所有对象都用 new 操作符来创建。以下是 new 操作符所做的事情:
1. 它计算类型及其所有基类型(一直到 System.Object,虽然它没有定义自己的实例字段)中定义的所有实例字段需要的字节数。堆上的每个对象都需要一些额外的成员 35——即“类型对象指针” type object pointer)和“同步块索引”( sync block index)。这些成员由 CLR 用于管理对象。这些额外成员的字节数会计入对象大小。
2. 它从托管堆中分配指定类型要求的字节数,从而分配对象的内存,分配的所有字节都设为零( 0)。
3. 它初始化对象的“类型对象指针”和“同步块索引”成员。
4. 调用类型的实例构造器,向其传入在对 new 的调用中指定的任何实参(上例就是字符串"ConstructorParam1")。大多数编译器都在构造器中自动生成代码来调用一个基类构造器。每个类型的构造器在调用时,都要负责初始化由这个类型定义的实例字段。最终调用的是 System.Object的构造器,该构造器只是简单地返回,不会做其他任何事情。为了证明这一点,可使用 ILDasm.exe加载 MSCorLib.dll,自己检查 System.Object 的构造器方法。
new 执行了所有这些操作之后,会返回指向新建对象一个引用(或指针)。在前面的示例代码中,这个引用会保存到变量 e 中,后者具有 Employee 类型。顺便说一句,没有和 new 操作符对应的一个 delete 操作符;换言之,没有办法显式释放为一个对象分配的内存。 CLR 采用了垃圾回收机制(详情在第 21 章讲述),能自动检测到一个对象不再被使用或访问,并自动释放对象的内存。