首页 > 代码库 > 02_类型基础

02_类型基础

 

CLR要求每个类型最终都从system.Object类型派生,

所有的类型最终都从system.Object派生,所以每个类型的每个对象都有一组最基本的方法,

如:Equals,判断两个对象值是否相同,相同返回true,否则返回false.

GetHashCode:返回对象的值得一个哈希码.

ToString():默认返回类型的完整名称.

GetType():返回从Type派生的一个对象的实例.指出调用GetType的那个对象是什么类型.

System.Object 受保护方法:

MemberwiseClone:创建类型的一个新实例,并将新对象的实例字段设与this对象的实例字段完全一致,返回的是对新实例的引用. 

Finalize:在垃圾回收器判断对象应该被作为垃圾收集之后,在对象的内存被实际回收之前,会调用这个虚方法,需要在回收之前执行一些清理工作的类型应该重写这个方法.

CLR中要求所有对象都用 new 操作符来创建.例如: Employee  e =  new  Employee("dd");

那么new 是做什么事情呢?

A: 首先new会先计算类型以及所有基类型中定义的所有字段需要的字节数.堆上的每个对象都需要一些额外的成员---"类型对象指针,同步块索引",这些成员由CLR用于管理对象,这些额外的成员最终也会计入对象的大小.

B: 在托管堆中分配指定类型要求的字节数,分配对象的内存,分配的所有字节都设为0;

C: 初始化类型对象指针和同步块索引.

D: 调用类型的实例构造器,传入在对new的调用中指定的实参.(也就是例子中的dd);

E:  最后返回指定新建对象一个引用(指针),这个引用会保存在变量(例子)e中,

new操作符,无法对其创建的对象进行显式释放,CLR通过自身的垃圾回收机制自动释放对象的内存.

CLR最重要的一个特性就是类型安全.也就是说在运行时,CLR总是知道一个对象的类型是什么.

我们在开发的时候,经常需要将一个类型转换为其他的各种类型,在此,CLR允许将一个对象转换为它的类型后者它的任何基类型,向基类型转换被认为是一种安全的隐式转换,将对象转换为它的某个派生类型时,只能是显式转换.这样的转换可能会在运行时失败.

as和is操作符来转型.

在C#语言中进行类型转换的另一种方式是使用is操作符.is检查一个对象是否兼容于指定的类型,并返回一个Boolean值,true或false,is操作符永远不会抛出异常.

?
1
2
3
Object  o  =  new  Object();
Boolean  b  =  (o is Object); // true
Boolean  b2 = (o is Employee)//false

 如果引用的为null,is操作符总是返回false,因为没有可检查其类型的对象.

一般is会像这样的来使用.

 if(o is Employee) { Employee e = (Employee)o; } 

is操作符的性能比较低,因为CLR首先必须判断变量引用的对象的实际类型,然后CLR必须遍历继承层次结构,用每个基类型去核对指定的类型.

as操作符就是为了简化这个代码的写法.同时提升性能.

Employee e = o  as  Employee;
if(o != null)
{}

如果o兼容于Employee类型,as操作符会返回同一个对象的一个非null引用,如果不兼容则会返回null.
as操作符造成CLR只校验一次对象的类型.所以会比IS快.

as操作符的工作方式和强类型转换一样.只是他不会抛出异常,只会返回null.所以在使用时,要判断对象是否为null.