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. 每个类型对象都最后都包含一个方法表.类型中定义的每个方法都有一个对应的记录项在这个表中;

原文地址:https://www.cnblogs.com/ry123/p/2791743.html