zoukankan      html  css  js  c++  java
  • 框架设计: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异常。
  • 相关阅读:
    菖蒲河公园-中山公园-天安门广场一日游
    LeetCode 485 Max Consecutive Ones
    LeetCode 766. Toeplitz Matrix
    LeetCode 566 Reshape the Matrix
    LeetCode 561. Array Partition I
    算法学习系列之(1):常用算法设计方法
    纪念2017,展望2018
    Java server数据之(4):Redis鸟瞰
    《机器学习》读书笔记-第一章 引言
    node.js实践第二天
  • 原文地址:https://www.cnblogs.com/itgmhujia/p/1106080.html
Copyright © 2011-2022 走看看