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.
原文:http://www.cnblogs.com/MR-LIUB/p/3710520.html