C#中的"装箱"(boxing)与"拆箱"(unboxing)

来源:互联网 发布:文字转换语音软件 编辑:程序博客网 时间:2024/04/29 10:01

/* 作者:耿奕廷    版权所有,转载时请注明出处及作者    */

 

我们知道在C#中,所有的类型都派生自类object,而派生类和继承类之间可以互相转换,这就有了“装箱”与“拆箱”的概念。

装箱:是指把某一类型的值显式或隐式的转换成object类型,或转成被此类型继承的接口。装箱后,这个object类的值在内存中heap区,是原类型的一个拷贝。如:

   int i=2;
   string str="Hello";
   object objstr=str;      //隐式
   object objint=(object)i; //显式

有意思的是被装箱后可以用obj.ToString()来打印原值,如 Console.WriteLine(objstr.ToString())显示的是Hello。

拆箱:是指把装箱后的object类型显式转成原类型。这时可以用is运算符或GetType()来判断object的原类型。如

int  n=(int)objint;

int s=(string)objstr;

if(objint is int) Console.WriteLine("Yeah!");

if(objstr.GetType().ToString()=="System.String") Console.WriteLine("OK");

拆箱注意:

1. 如拆箱后没有转成原类型,编译时不会出错,但运行会出错。所以拆箱后转换类   型 一定要正确。

2.用GetType().ToString()判断时一定要使用类型全称,如:System.String 而不要用String