第二部分 设计类型:第4章 类型基础

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

所有类型派生自System.Object,有一下公共实例方法:
1.Equals:两个对象具有相同值返回true
2.GetHashCode:返回对象值的哈希码。
3.ToString:默认返回类型完整名称(this.GetType().FullName)
   核心类型Boolean和Int32重写了该方法。为方便调试可以重写返回对象各个字段的值字符串。
4.GetType:返回Type派生的一个对象的实例,指出调用GetType那个对象的类型。

System.Object的GetType方法返回的是“类型对象指针”地址,可以判断出真实的类型。

从System.Object派生的类型可访问如下受保护方法:
1.MemberwiseClone:返回新实例(与this对象实例字段一样)的引用。
2.Finalize:内存回收前会调用此虚方法。回收之前需要执行清理工作的类型应该重写。

Employee e = new Employee("Param1");
CLR要求创建对象必须用new操作符,new操作符做的事情
1.计算类型和基类型所有实例字段需要的字节数。(包含“类型对象指针”和“同步块索引”)
2.它从托管堆中分配需要的字节数,分配对象内存,分配的字节都设为0。
3.初始化对象“类型对象指针”和“同步块索引”成员
4.调用类型实例构造器,传入实参,初始化实例字段。
new完成以上操作后,返回指向新建对象的引用(指针)

4.2类型转换
CLR允许将对象转换为它的实际类型或基类型。
Object o = new EmPloyee(); //转换为基类型
EmPlyee e =(Emplyee)o; //转换为实际类型,有可能失败,所以要显示转换。

使用C#的is和as操作符来转型
is操作符检查对象是否兼容于指定的类型,返回Boolean值(is不会抛异常,对象引用为null返回false);
通常用法:
if(o is Employee){ //检查一次
   Employee e = ()o; //再次检查,判断实际类型,再遍历继承层次结构进行核对,消耗性能。推荐用as写法
   //在if语句剩余部分使用e
}

as操作符简化写法,并提升性能。
Employee e = o as Employee; //检查是否兼容,兼容返回对象引用,不兼容返回null
if(e != null){
  //在if语句中使用e
}
以上只进行了一次类型校验。上面is校验2次。
as不会抛出异常。一般判断是否为null即可

 

 4.3命名空间和程序集
命名空间(namespace)用户对相关类型进行逻辑分组,方便定位类型。命名空间可以让类型名称更具唯一性。通过using指令,可以省略类型前缀减少输入量。

using为类型或命名空间创建别名:
using WintellectWidget=Wintellect.Widget;

注:命名空间和程序集(实现了一个类型的文件)不一定是相关的。同一个命名空间中的各个类型可能是在不同程序集中实现的。比如,System.IO.FileStream类型在MSCorLib.dll中实现,System.IO.FileSystemWatcher类型在System.dll中实现。

 

4.4运行时的相互联系
每个方法的调用前(“序幕”)都会在栈中分配局部变量内存并将局部变量初始化(null,0),但访问未显示初始化局部变量会报错:使用了未赋值的局部变量。栈是从上到下构建的。

对象包含:“类型对象指针”(指向类型对象)、“同步块索引”和类型对象(包含字段和方法表)。

图中红框部分的方法表示JIT编译(即时编译)的代码。

 

 

 

 

 

posted @ 2014-02-20 16:40  IT浪潮之巅  阅读(211)  评论(0编辑  收藏  举报
   友情链接: 淘宝优惠券