C#装箱拆箱

来源:互联网 发布:vscode环境搭建 编辑:程序博客网 时间:2024/05/01 01:19
首先,说一下装箱和拆箱。
 
      在.net中的通用类型系统(Common Type system,CTS)中,所有类型都是对象(object),都派生自System.Object。CTS支持两组类型:值类型和引用类型。如果变量是值类型那么这个变量就包含实际的数据。也就是在内存中确实会分配那么一部分空间给这个变量并存储值,引用类型就类似一个类型安全的指针,本身并没有开辟内存空间去存储东西。这玩意是基础,罗嗦的重复一下。
 
     而装箱(box)就是将值类型转换为引用类型的过程。相反的过程就叫拆箱(unbox)。
  
     a、装箱
     一个很简单的例子。新建一个控制台程序,在Main()里面就写两句话。   
    
b、拆箱
   在刚才程序的基础上,再加一句话变成,编译:
            int i = 13;
            object ob = i;
            int j = (int)ob;
   在装箱的时候,并不需要显示类型转换。但在拆箱时需要类型转换。这是因为在拆箱时对象可以被转换为任何类型。
说说拆箱unbox的内部过程:
   (1)因为一个对象将被转换,所以编译器必须先判断堆栈上指向合法对象的地址,以及这个对象类型是否可以转换为MSL unbox指令调用中指定的值类型。如果检查失败就抛出InvalidCastException异常。
   (2)校验通过后,就返回指向对象内的值的指针。可以看出,装箱操作会创建转换类型的副本,而拆箱就不会。不过注意一下,在我们装箱的时候是先把变量i的值复制了一份赋给ob的,所变量j拿到的是ob这个变量的引用。也就是后面再改变i的值并不会影响j的值,但是改变ob的值就会。
     int i = 13;
     object ob = i;
 
原创粉丝点击