C#装箱(boxing)和拆箱(unboxing)

  学习过C#的程序员都知道,在C#中有值和引用两种数据类型。但是这两种类型具体有哪些区别呢?相信很多人都难以说明白。今天就来讨论一下这个问题。

  一句话它们的区别就是在于复制机制的差异

  值类型直接包含值,也就是变量引用的位置就是值在内存中实际存储的位置。所以,如果将一个值类型赋值给另一个值类型,会在新变量的位置创建原始变量的值的一个内存副本。相同值类型的第二个变量不能引用与第一个变量相同的内存位置(假定没有out或ref参数)。所以,更改一个变量的值不会影响两外一个的值。值类型需要的内存量会在编译时固定下来,而且不会在运行时改变。因为大小是固定的,所以值类型可以存储在(stack)的内存区域中。

  引用类型存储的是对一个内存位置的引用(内存地址),要去那个位置才能找到真正的数据。因此,为了访问数据,"运行时"要从变量中读取内存位置,然后跳转到包含数据的内存位置。引用类型指向内存区域称为(heap)。

  其实学习过汇编的朋友,很容易会联想到CPU的寻址方式中的直接寻址存储器间接寻址与上面两种值类型的引用方式很相同。虽然我没有去求证,但我相信它们之间肯定会有一定的联系。

  由于两种不同类型的存在,而且我们在实际开发中需要对这两种类型进行转换,所以我们有必要知道这其中的工作过程。这就是我们常说的装箱拆箱装箱,简单的说就是将值类型转换为引用类型。拆箱,就是将引用类型转换为值类型。

  装箱的过程:1、首先在堆中分配好内存。它将用于存放值类型的数据以及一些必要的指针。2、将栈上的数据复制到堆上已分配好的位置。3、新对象引用得到更新,指向堆上的位置。

  拆箱时对堆上的数据进行解引用,大多数时候都会紧接在拆箱之后进行一次复制动作。

  

posted @ 2010-12-04 18:53  草市江田  阅读(374)  评论(0编辑  收藏  举报