框架设计:CLR Via C# 第四章

4.1所有的类型都是System.Object类型派生的
class Employee{...}  =class Employee:System.Object{...}

Employee e=new Employee("ConstructorParaml");
new 关键字要做的事情
1、它计算类型及其所有基类型(最高到System.Object,虽然它没有定义自己的实例字段)中定义的所有实例字段需要的字节数。堆上的每个对象都需要一些额外的成员----称为“类型对象指针(type object pointer)”和“同步块索引(sync block index)”,这些成员将由CLR用来管理对象。这些额外成员的字节数会加到对象大小上。
2、它从托管堆中分配制定类型所需的字节数,从而分配对象的内存,分配的所有字节都设为零(0).
3、它初始化对象的“类型对象指针”和“同步块索引”成员。
4、调用类型的实例构造器,向其传入在new调用中指定的任何实参(上例就是字符串“ConstructorParaml")。大多数编译器都在构造器中自动生成代码来调用一个基类的构造器。在调用每个类型的构造器时,构造器都负责初始化由这个类型定义的实例字段。这样,最终会调用到System.Object 的构造器,该构造器只是简单地返回,不会做其他任何事情。

4.2 强制类型转换
GetType方法获取当前对象的类型;
不是从当前类派生出的对象对它进行强制转换的时候抛出System.InvalidCastException异常

class Employee{...}
class program
{
    static void Main(){
    DataTime newTime=new DataTime(2007,1,1);
    //抛出上面所说异常
    //DataTime不是Employee派生出来的饿
    Employee e=(Employee) newTime;
    }
}

        利用is和as操作符进行强制类型转换
        is:检查一个对象是否兼容于指定的类型,并返回一个Boolean值;true or false;
        is永远不会抛出异常,它有返回值。
    example:
        Object o=new Object();
        Boolean b1=(o is Object);//b1 返回true
        Boolean b2=(o is Employee);//b2 返回 false
        
        as:返回对于同一个对象的非NULL引用,如果不兼容,则返回一个null
        Emloyee e=o as Employee;
        if(e!=null){
        }
        as相当于强制转换一样,不会抛出异常,相反当返回值是一个null值的时候,你要调用该对象,则会产生以个null的System.NullReferenceException异常。
原文地址:https://www.cnblogs.com/itgmhujia/p/1106080.html