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