所有类型都从System.Object 派生,‘运行时’要求每个类型都从System.Object类派生,也就是说,以下两个类型定义完全一致:
//隐式派生字Object class Employee { do something..... } //显式派生字Object class Employee:System.Object { do something..... }
由于所有类型最终都是从System.Object派生,所以每个类型的每个对象都保证了一组最基本的方法,System.Object提供了一下公共实例方法:
1、Equals:如果两个对象具有相同的值,就返回true。
2、GetHashCode:返回对象的值的哈希。
3、ToString:默认返回类型的完整名称(this.GetType().FullName).
4、GetType:返回Type派生的一个类型的实例,指出调用GetType的那个对象是什么类型。返回的Type对象可以和反射类配合,获取与对象的类型有关的元数据信息。
CLR要求所有的对象都使用New关键字创建,以下代码展示了如何创建一个Employee对象:
Employee e = new Employee("ConstructorParameter");
以下是New操作符所做的事情
1、计算类型及其所有的基类型(一直到System.Object,虽然他没有定义自己的实例字段)中定义的所有实例需要的字节数,堆上每个对象都需要一些额外的成员,包括类型对象指针(type object poniter) 和 同步块索引(sync block index)。CLR利用这些成员管理对象,额外成员的字节要计入成员的大小。
2、从托管堆中分配类需要的字节数,从而分类对象的内存,分配所有的字节都设为零。
3、初始化对象的“类型对象指针”和“同步索引块”成员。
4、调用类型的实例构造器,传递在New调用中指定的实参。
new执行了所有这些操作之后,返回指向新建对象的一个引用(指针)。
注: 没有和New操作符对应的delete操作符:换言之没有办法显式的释放为对象分配的内存,CLR采用了垃圾回收机制(GC)自动检测到一个对象不再被使用和被访问,并自动释放对象的内存。