• CLR读书笔记第四章 类型基础


    4.1 所有类型都从System.Object派生

    1. 如题,那么所有类型具有以下公共方法:Equals,GetHashCode,ToString,GetType;其派生类型可以访问受保护的方法: MemberwiseClone;

    2. CLR要求所有对象都用 new 操作符来创建;

    new操作符的作用:

      @1 计算类型及其所有基类型(知道system.object)中定义的所有实例字段需要的字节数,+"类型对象指针"+"同步块索引"的字节数;

      @2 从托管堆中分配指定类型要求的字节数;

      @3初始化对象的"类型对象指针"和"同步块索引";

      @4调用类型的实例化构造器,传入参数;

    new执行了所有这些操作后,会返回一个指向新建对象的一个引用.

    4.2 类型转换

    1.CLR允许将一个派生类型隐式转换为一个基类型,将基类型转换为派生类型要显示转换; CLR会检查转型操作,确定总是转换为对象的实际类型或者其基类型;

       class Employee{...}...

       Object o=new Employee();  //隐式转化

       Employee e=(Employee) o;  //显示转换

     2. 类型转换  ---is 和 as的区别:

          @1 is检查一个对象是否兼容于指定的类型,并返回一个bool值,is不会抛异常;

        Object o=new Object();

        Boolean o1=(o is Obect);  //true

        Boolean o2=(o is Employee);  //false

        如果对象是null,is返回值为false,因为没有可检查的对象

         if(o is Employee)

       {  Employee e=(Employee) o ;....}

       以上方式会造成两次CLR检查: A CLR首先判断o引用的实际类型; B CLR遍历继承层次结构,用每个基类型去核对指定的类型(Employee);--- 性能低

      @2 as

      Employee e=o as Employee;

      if(e!=null){...}

      如果o兼容于Employee,返回一个非null的引用,否则返回null,as只会是CLR校验一次类型;

    4.3 命名空间和程序集

    1. 命名空间用于对相关的类型进行逻辑性分组,开发人员用于定位一个类型;

        using指令是可选的,using指示编译器尝试为一个类型附件不同的前缀直到找到一个匹配项;

    2. 为命名空间创建别名: using wintellectwidget=win;

      在C#中,namespace指令的作用: 告诉编译器为源代码中出现的每个类型名称附加命名空间前缀,减少打字量;

    3. 命名空间和程序集可能不想关;

    4.4 运行时的相互联系

    1.这一节讲解了  CLR的整个类型系统及其工作方式...看的不是很懂...不知道怎么写笔记了...

    2.堆上的所有对象都包含两个成员: 类型对象指针(Type Obect pointer) 同步索引块(syns block index);

    3. 每个类型对象都最后都包含一个方法表.类型中定义的每个方法都有一个对应的记录项在这个表中;

  • 相关阅读:
    关于AutoResetEvent和ManualResetEvent
    (转)使用 ODP.NET 和引用游标优化结果集
    胰腺
    SQL Cache Dependency
    败犬的远吠?
    吃亏和付出经常是必须的(转)
    AutoResetEvent 与 ManualResetEvent送花例子
    linux yum install
    SpringMVC+JPA+SpringData配置
    Spring AOP 实现原理
  • 原文地址:https://www.cnblogs.com/ry123/p/2791743.html
Copyright © 2020-2023  润新知