《CLR Via C#》 学习心得之二 类型基础
今天看了,类型基础这一章的内容,正好总结下,顺便分享下自己的感悟。
1,System.Object类型的意义
每个类型最终都是从System.Object派生,那么Object是最终的基类。它有四个公共方法,分为:
1,Equals。如果两个对象具有相同的值,这里相同的值有两层含义:一,两个引用对象是否相等,也就是说是否引用相同的地址;二,是否有相同的Value值。
2,GetHashCode。返回对象的值的一个哈希表。
3,ToString。该方法返回类型的完整名称。
4,GetType。返回从Type派生的一个对象的实例。
2,new操作符的作用
new操作符所做的事情有以下几点:
1,它计算类型及其所有基类型(一直到System.Object)中定义的所有实例字段需要的字节数。堆上的每个对象都需要一些额外的成员——即“类型对象指针”和“同步块索引”。
2,它从托管堆中分配指定类型要求的字节数,从而分配对象的内存,分配的所有字节都设为0。
3,它初始化对象的“类型对象指针”和“同步块索引”成员。
4,调用类型的实例构造器,向其传入在对new的调用中指定的任何实参。
new执行了所有的这些操作之后,会返回指向新建对象的一个引用,如果想要为分配的内存释放对象,则调用垃圾回收机制。
3,类型转换
CLR最重要的特性之一就是类型安全性,c#不要求任何特殊语法即可将一个对象转换为它的任何基类型,因为向基类型的转换被认为是一种安全的隐式转换,然而,将对象转换为它的某个派生类型时,c#要求开发人员只能进行显式转换。
代码如下:
public class Program { public static void Main() { //不需要转换 Object o=new Employee(); //需要转换 Employee e=(Employee) o; } }
4,Is和As操作符的作用
1,is操作符检查一个对象释放兼容于指定的类型,并返回一个布尔值,is操作符永远不会抛出异常。
2,as操作符的工作方式与强制类型转换一样,只是它永远不会抛出一个异常——相反,如果对象不能转型,结果就是null。
5,运行时的相互联系
类型、对象、线程栈和托管堆在运行时的相互关系。
1,如果已加载了CLR的一个进程,在这个进程中,可能存在多个线程。一个线程创建时候,会分配到一个1MB大小的栈,这个栈的空间用于向方法传递实参,并用于方法内部定义的局部变量。栈是从高地址想地址构建的。
2,在调用一个方法时候,还会将一个“返回地址”压入栈,被调用的方法在结束之后,应该返回到被调用的位置。
3,在托管堆中分配类型的对象,堆上的所有对象都包含两个额外的成员:类型对象指针和同步块索引。定义一个类型时候,可以在类型的内部定义静态数据字段,为这些静态数据字段提供支援的字节是在类型对象自身中分配的,在每个类型对象中,最后都包含一个方法表。在方法表中,类型中定义的每个方法都有一个对应的记录项。
4,构造器实际上就是修改对象状态的方法。
最后,总结下,在看本章内容时,主要看了类型、对象、线程栈和托管堆在运行时的相互关系。理解了实例成员是属于类的对象,静态成员是属于类的。实例的形式是有两种,一种是类的实例,也就是对象;另一种是类中定义的实例字段。