2012年3月26日星期一

读CLR via C#总结(2) 对象创建的原理和两种类型转换方法

读CLR via C#总结(2) 对象创建的原理和两种类型转换方法



一,对象创建的原理

  CLR要求所有的对象都用new操作符来创建,如下代码:

namespace NewobjectDemo1
{
class Employee
{
private string Name;
//构造函数
public Employee(string name)
{
Name = name;
}
}
class Program
{
static void Main(string[] args)
{
Employee e = new Employee("Mcgrady");//使用new操作符创建对象
}
}
}

  编译后的IL代码:


  注:new操作符在IL中的对应的代码为newobj。

  实际上new操作符帮我们做了以下事件:

  1,计算类型及其所有基类型所需要的字节数并依此分配内存大小。

  2,初始化对象的"类型对象指针"和"同步块索引"成员。

  3,调用类型的实例构造器,向其传入在对new 调用中指定的任何实参(上例中就是字符串"Mcgrady")。

二,两种类型转换方法

  方法一:隐式转换和显式(或叫强制)转换

      从派生类型向它的基类型转换叫隐式转换,而从基类型向它的某个派生类型转换叫显式转换。如下代码:

namespace NewobjectDemo1
{
//该类型隐式派生自Object
class Employee
{
}
class Program
{
static void Main(string[] args)
{
//隐式转换,因为new返回一个Employee对象,而Object是Employee的基类
Object o = new Employee();

//显式转换,因为Employee派生自Object
Employee e=(Employee)o;
}
}
}

  

  方法二:使用is和as操作符来转型

      is检查一个对象是否兼容于指定的类型并返回一个bool值:true或false;as操作符执行实际的转换。如下代码:

namespace NewobjectDemo1
{
//该类型隐式派生自Object
class Employee
{
}
class Program
{
static void Main(string[] args)
{
object o = new object();

//检查对象o是否兼容于类型Employee
if (o is Employee)//如果对象引用为null,is操作符总是返回false,注意is操作符永远不会抛出异常
{
Employee e = o as Employee;//等价于:Employee e=(Employee)o

//在使用变量e之前最好检查引用是否为null
if (e != null)
{
//有if语句中使用e
e.ToString();
}
}
}
}
}


TAG: