Q1: Object类型包含哪些方法?
A1: Object类型共包含6个方法,Equals, GetHashCode, ToString, GetType, MemberwiseClone和Finalize.
Q2: new一个对象的过程是什么?
A2: 1)计算对象所需字节数,包括该类型及其基类型定义的所有实例字段所需的字节数和类型对象指针、同步块索引所需字节数,类型指针和同步块索引是CLR用来管理对象的;2)在托管堆上分配该对象所需内存空间;3)初始化类型对象指针和同步块索引;4)执行构造函数。大多数编译器都在构造函数中自动生成一段代码调用基类构造函数,每个类型的构造函数在执行时都会初始化该类型定义的实例字段。5)返回指向新建对象的一个引用,保存在对象变量中。
可用如下代码验证第四步:
执行结果如下:
Q3: 父类型和子类型间如何进行转换?
A3: C#允许将一个对象从它的本身类型转换为它的父类型,这是安全的,不需要做任何额外操作,但要将一个对象从它的本身类型转换为它的子类型,则必须要显式转换,因为可能会失败。见代码:
这段代码是无法编译通过的,在Main方法的第四行会报一个这样的错误:
Error 1 Cannot implicitly convert type 'TypeBasic.Person' to 'TypeBasic.Man'. An explicit conversion exists (are you missing a cast?) C:\Users\Allen\Documents\Visual Studio 2012\Projects\TypeBasic\TypeBasic\Program.cs 16 21 TypeBasic
很显然,一个 “男人” 一定是一个人,故可以直接转换,但一个 “人” 并不一定是一个 “男人”,所以必须要显式转换。可将代码这样改写:
// To
Man m = (Man)person;
</div>
这样就可以成功通过编译,但是在运行的时却抛出了异常,很显然,Person不能被转换为Man. 什么情况下Person可以被转换为Man? 见如下代码:
Q4: is和as操作符的作用是什么?
A4: is操作符用来判断一个对象是否属于某种类型,返回一个布尔值。改写下上例的Test方法:
</div>以上代码共进行了两次类型检测,is操作符首先检测p是否为Man类型,在if的方法体中进行强制转换时,CLR会再次检测p的类型,这对性能有一定影响。
as操作符很好的解决了这个问题,再次改写Test方法:
</div>as操作符在检测p的类型后会直接对p进行类型转换,返回一个Man类型的对象,若检测出p不是Man类型,则会返回null. 整个过程只进行了一次类型检测。
Q5: 什