(转)深入理解C#的装箱和拆箱

装箱和拆箱的意义在于什么呢?

最近学习装箱和拆箱有关知识,表面上清楚了是值和引用的互换
但是不清楚这类互换在现实解决问题中有什么作用?

 

.NET包含一个特殊的Object类,可以接受任意的数据类型的值,当所传递或所赋值的类型不是一个特定的数据类型时,object类就提供了一种传递参数和赋值的通用方法。赋给object的值必须作为引用类型,并存放砸托管堆中。

 

装箱和拆箱是值类型和引用类型之间相互转换是要执行的操作。 

1. 装箱在值类型向引用类型转换时发生

2. 拆箱在引用类型向值类型转换时发生

光上述两句话不难理解,但是往深处了解,就需要一些篇幅来解释了。

我们先看装箱时都会发生什么事情,下面是一行最简单的装箱代码


2.显式转换 
显式类型转换,就是强制类型转换。与隐式转换正好相反,显式转换需要用户明确指定转换的类型,不如看下面例子:           long l = 5000;           int I = (int)l; 
显式转换可以发生在表达式的计算过程中。它并不是总能成功,而且常常可能引起信息丢失。显式转换包括所有的隐式转换。 显式转换包括下面几种: 

1.4  装箱和拆箱 
装箱和拆箱使我们可以把一个值类型当作一个引用类型看待。装箱转换是指将一个值类型隐式的转换成一个Object类型,拆箱转换是指将一个Object类型显式地转换成一个值类型,他们互为逆过程。 
装箱(boxing) 
装箱转换是指将一个值类型隐式转换成一个object类型,或者把这个值类型转换成一个被该值类型应用的接口类型。把一个值类型的值装箱,也就是创建一个object实例并将这个值给这个objet.不如: 

         Int i = 10;      

    Object obj = i; 

拆箱(unboxing) 
拆箱转换是指将一个对象类型显式转换成一个值类型,或是将一个接口类型显示地转换成一个执行该接口的值类型。 
拆箱的过程分为两步:首先,检查这个对象的实例,看它是否为给定的值类型的装箱值。然后,把这个实例的值拷贝给值类型的变量。如: 
    Int i = 10;     Object obj = i;     Int j = (int)obj;

 

在于类型的转换

例如一个函数要处理传入的参数,但是这个参数可能是A、C、E这三种类型的类,那么一般做法就是重载函数。如果要是使用box和unbox的话,就可以把形参设定为object类型的,然后再用gettype来确定到底是哪种类型的类被传来处理。明白不?写个例子吧:
private void DisposeFunc( object O )
{
     switch( o.getType().ToString() )
     {
           case "A": //处理A;
           case "C": //处理C;
           。。。。。。。。。。。。。。
      }
}

  1. 装箱:

    int age = 24;

    object refAge= age;

    可以看的出,第一条语句创建一个变量age,并将值放在托管栈中;

    第二条语句将age的值赋给引用类型。它将值24放在托管堆中。

    这个值类型包装为引用类型的过程,称为装箱。

    C#装箱和拆箱原理

  2. 2

    拆箱:

    相反,将引用类型转换为值类型的过程称为拆箱。拆箱将对对象强制转换为原来的类型。对前面的对象进行拆箱。

    int  newAge = (int) refAge;

    string newAge =(String) refAge;

    拆箱的值必须和它要转换的目标的变量有相同的类型。

    C#装箱和拆箱原理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值