技术开发 频道

C#中关于装箱和取消装箱的示例

【IT168 技术文档】

  装箱和取消装箱使值类型能够被视为对象。对值类型装箱将把该值类型打包到 Object 引用类型的一个实例中。这使得值类型可以存储于垃圾回收堆中。取消装箱将从对象中提取值类型。

在此示例中,整型变量 i  被“装箱”并赋值给对象 o 。

C#
int i = 123;
object o = (object) i; // boxing

然后,可以对对象 o 取消装箱并将其赋值给整型变量 i:

o = 123;
i = (int) o; // unboxing

  装箱是值类型到 object 类型或到此值类型所实现的任何接口类型的隐式转换。对值类型装箱会在堆中分配一个对象实例 ,并将该值复制到新的对象中。

C#
class TestBoxing
{
    static void Main()
    {
        int i = 123;
        object o = i; // implicit boxing

        i = 456; // change the contents of i

        System.Console.WriteLine("The value-type value = {0}", i);
        System.Console.WriteLine("The object-type value = {0}", o);
    }
}

The value-type value = 456

The object-type value = 123

  此示例通过装箱将整数变量 i 转换为对象 o。这样,存储在变量 i 中的值就从 123 更改为 456。该示例表明原始值类型和装箱的对象使用不同的内存位置,因此能够存储的是不同的值。

  需要说明的是,值类型是在栈上分配的,而引用类型在托管堆上分配,把一个值类型装箱,会在托管堆上重新分配一块内存,然后把值复制给这个新分配对象的内存中,然后返回这块新分配的内存。对引用类型的改动不会再作用于原来的值类型。

0
相关文章