装箱和拆箱


<script type="text/javascript">function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>

在C#中的有两种类型的变量:值类型和引用类型。当值类型和引用类型相互转化时,会发生装箱和拆箱的过程。这里有一点要声明:经过拆箱或装箱的对象会多出它自己一份拷贝,如图所示:

从图可以看出它和它的拷贝不在一个存储区域。这也是值类型和引用类型的区别所在。值类型总是在栈中,而引用类型总是在托管堆中。(目前J2SE5.0也支持了装箱和拆箱,但是我目前不知道是否和C#一样)。为了进一步理解看下面例子:
struct Point{
public int x;
public int y;
}

static void Main(){
Point p;
p.x=10;
p.y=20;

Object o=p;//box. 将值类型从栈中拷贝到堆中。

/************************************************************************/
/*
* 从托管堆中将对象拷贝到栈中。
* */
/************************************************************************/
Point p2=(Point)p;
Console.WriteLine(“p2.x:=" p2.x “ p2.y:=“ p2.x);

p.x=16;
p.y=34;

Console.WriteLine(“p2.x:=" p2.x “ p2.y:=“ p2.x);

Console.WriteLine(“p.x:=" p.x “ p.y:=“ p.x);
}

输出结果为:
p2.x:=10;p2.y=20;
p2.x:=10;p2.y=20;
p.x:=16;p.y=34;

可知,变量经过拆箱/装箱后,得到是自己的另一份拷贝。

    装箱是指将值类型转换为引用类型的过程,拆箱是指将引用类型转换为值类型的过程。在装箱时采用隐式转换,在拆箱是时采用显示转换。即当派生类转换为基类时(缩小)采用隐式转换,当基类转换为派生类时(扩大)采用显式转换。

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleAppExample.NetType
{
    class BoxUnBox
    {
        static void Main()
        {
            int foo = 100;
            object bar = foo;//缩小时(派生类转换为基类),隐式转换,装箱
            int soo = (int)bar;//扩大时(基类转换为派生类),显式转换,拆箱
        }
    }
}

 
装箱和拆箱:任何值类型、引用类型可以和object(对象)类型之间进行转换。装箱转换是指将一个值类型隐式或显式地转换成一个object类型,或者把这个值类型转换成一个被该值类型应用的接口类型(interface-type)。把一个值类型的值装箱,就是创建一个object实例并将这个值复制给这个object,装箱后的object对象中的数据位于堆中,堆中的地址在栈中。被装箱的类型的值是作为一个拷贝赋给对象的。如:
int i = 10;
object obj = i; //隐式装箱
object obj = object(i); //显式装箱
if(obj is int) //int
       Console.WriteLine(“OK”);

Console.WriteLine(obj.GetType()); //System.Int32

有两种方式来查看包装以后的引用对象中包装的原始数据的类型。要判断原始类型是否是某个给定的原子类型,用is;如果要返回一个字符串,可以用object类的GetType方法。

 

拆箱转换是指将一个对象类型显式地转换成一个值类型,或是将一个接口类型显式地转换成一个执行该接口地值类型。注意装箱操作可以隐式进行但拆箱操作必须是显式的。拆箱过程分成两步:首先,检查这个对象实例,看它是否为给定的值类型的装箱值。然后,把这个实例的值拷贝给值类型的变量。比如:
int i = 10;
object obj = i;
int j = (int)obj;
有两种方式来查看包装以后的引用对象中包装的原始数据的类型。要判断原始类型是否是某个给定的原子类型,用is;如果要返回一个字符串,可以用object类的GetType方法。

 

拆箱转换是指将一个对象类型显式地转换成一个值类型,或是将一个接口类型显式地转换成一个执行该接口地值类型。注意装箱操作可以隐式进行但拆箱操作必须是显式的。拆箱过程分成两步:首先,检查这个对象实例,看它是否为给定的值类型的装箱值。然后,把这个实例的值拷贝给值类型的变量。比如:
int i = 10;
object obj = i;
int j = (int)obj;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值