您的位置:程序门 -> .net技术 -> c#



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


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


装箱和拆箱的意义在于什么呢?[已结贴,结贴人:oract666]
发表于:2007-02-28 16:50:20 楼主
最近学习装箱和拆箱有关知识,表面上清楚了是值和引用的互换
但是不清楚这类互换在现实解决问题中有什么作用?
能否指点一下装箱和拆箱的真实意义在于什么呢?
发表于:2007-02-28 16:53:011楼 得分:0
在于类型的转换
发表于:2007-02-28 16:55:352楼 得分:0
值类型和引用类型的转换。
发表于:2007-02-28 16:59:013楼 得分:0
值类型和引用类型的转换   主要用在什么情形下呢?
也就是说它主要为了解决什么类的问题呢?
发表于:2007-02-28 17:07:214楼 得分:0
没办法才那样装箱又拆箱的。

.net   2.0开始支持的泛型就减少了这种‘痛苦'。

不过,装箱拆箱又有它灵活的一面,至少他不会预先确定要存储的是值类型还是引用类型。
发表于:2007-02-28 17:09:175楼 得分:0
便于   类型装换..

比如给个函数参数   预先并不知道传入的是什么类型
object   定义就很有效

发表于:2007-02-28 17:09:546楼 得分:0
在于类型的转换

例如一个函数要处理传入的参数,但是这个参数可能是a、c、e这三种类型的类,那么一般做法就是重载函数。如果要是使用box和unbox的话,就可以把形参设定为object类型的,然后再用gettype来确定到底是哪种类型的类被传来处理。明白不?写个例子吧:
private   void   disposefunc(   object   o   )
{
          switch(   o.gettype().tostring()   )
          {
                      case   "a ":   //处理a;
                      case   "c ":   //处理c;
                      。。。。。。。。。。。。。。
            }
}
发表于:2007-02-28 17:10:067楼 得分:0
数据类型转为string
或string   转为数据
发表于:2007-02-28 17:22:448楼 得分:0
以下援引   《c#高级编程》

        第2章介绍了所有类型,包括简单的预定义类型,例如int和char,以及复杂类型,例如从object类型中派生的类和结构。下面可以像处理对象那样处理字面值:
        string   s=10.tostring();
        但是,c#数据类型可以分为堆栈上分配的值类型和在堆上分配的内存引用类型。如果int不过是堆栈上一个4字节的值,该如何在它上面调用方法?

我猜想书上的意思是把值类型转变为引用类型用来进行方法的调用。可是这句话我不太理解:如果int不过是堆栈上一个4字节的值,该如何在它上面调用方法?

int也是派生于object,当然可以引用tostring方法了啊

还是另有所指?
发表于:2007-02-28 17:27:519楼 得分:0
to   tjvictor(终于升星了,向两星奋斗)  

请教一下,装箱和拆箱不是仅仅指的值类型和引用类型之间互转的情形吗?
“例如一个函数要处理传入的参数,但是这个参数可能是a、c、e这三种类型的类”   那么此时被转换的是引用类型了,函数参数类型是object,也是引用类型啊

这样可以吗?
发表于:2007-02-28 17:39:3210楼 得分:0
类型转换,折箱装箱是专业术语。
发表于:2007-02-28 17:42:1011楼 得分:0
dddddddddddddddddd
发表于:2007-02-28 17:42:5412楼 得分:0
asdf
发表于:2007-02-28 17:43:0913楼 得分:0
ddddd
发表于:2007-02-28 17:49:0214楼 得分:0
有时封箱和拆箱操作会影响应用程序效率,可以看看.net   框架设计这本书
发表于:2007-02-28 17:53:0915楼 得分:0
to   javak()  

是否类似于c++   中的父类指针可以指向其派生的不同子类   那样的操作方式呢?
发表于:2007-02-28 17:54:5216楼 得分:0
to   blazers_hust()  

嗯  
问题是我现在还没弄清楚装箱、拆箱究竟是达成什么目的而采取的,搞清楚这个以后我再研究一下和相关方法的性能比较
发表于:2007-02-28 18:56:2117楼 得分:0
用多了就知道了,文字上说不上来...
发表于:2007-02-28 19:08:2818楼 得分:0
线程堆栈上的内存分配和托管堆上的内存分配
详见《框架设计   clr   via   c#》5.3值类型的装箱拆箱
发表于:2007-02-28 19:15:4819楼 得分:0
我也没明白,至少在我的使用中不怎么在意。
发表于:2007-02-28 20:00:3820楼 得分:0
帮顶   !
学习!
发表于:2007-02-28 23:07:1221楼 得分:0
楼主一定要区分堆和栈,这是两个完全不同的概念,不能笼统的说是堆栈.

关于装箱和拆箱,往往是在对值类型进行的操作,目的是将值类型数据从在栈上的存储转移到堆上,这样就和普通object具有了同样的存储解构:栈上存储地址,堆上存储数据.这样就可以达到统一处理的效果.
发表于:2007-02-28 23:07:3222楼 得分:0
知道是什么就可以了   其实就是个名字
发表于:2007-02-28 23:32:2223楼 得分:0
值类型操作简便高效,而引用类型更符合oo设计的基本准则。

比如int   as   value   type只占4字节,最小的object(不含数据)也要8字节。value   type如果用栈操作的话不需要而外的创建对象和gc开销。但是.net框架是统一在object继承的基础上,所以所有的类型都必须符合object的引用类型定义和操作,所以才可能有dosomething(object   param);这样的抽象。

box和unbox可以把这两者的优点统一起来。
发表于:2007-03-01 00:04:3524楼 得分:0
学习下
发表于:2007-03-01 00:25:0725楼 得分:0
值类型和引用类型放在不同的地方,在互相转换的时候需要把数据搬过来搬过去,这就是装箱和拆箱了.
发表于:2007-03-01 09:18:1026楼 得分:0
装箱和拆箱的意义可以理解为值类型和引用类型的转换...要理解转换的意义,你就必须要先了解值类型和引用类型的区别和特点...

当你把一个值类型赋予给另外一个值类型,则会在堆栈中复制一个副本.修改值类型的数据,则不会影响到另一个数据值..而引用类型的赋值.把一个引用变量赋予另一个引用变量,则复制的是引用,而非内存值,所以,修改一个变量会影响到另外一个引用.

如果再深入了解的话,你会发现类型转换之间的关系对于性能的影响和操作的结果是很大的..看下面的这个例子:
string   s   =   10.tostring();
上面的代码的用拆箱的形式实现,代码表现为:
int   i   =   10;                                                       //在栈上分配一个int类型
object   o   =   i;                                                   //把栈上的数据移到堆中,进行拆箱操作
string   s   =   o.tostring();                             //转换数据      


如果有兴趣可以参考 <c#高级编程> 和李建忠翻译的 <microsoft.net框架程序设计(修订版)   > 两本书的封箱和拆箱的章节...


发表于:2007-03-01 09:28:2227楼 得分:0
装相和拆相,可以一个函数提供统一的接口,不需要重载了
eg:
public   void   abc(   object   i){....}

这个函数的参数   可以给所有继承object的类对象用,但是不能给那些基元类型如int,char等用
所以用装相来.

2005已经有泛型了,可以1.避免用装相带来的性能损失
2.可以在调用时对参数的类型进行check.比进object,什么都是合法的.
发表于:2007-03-01 10:03:4128楼 得分:0
把所有类型都统一成引用类型
发表于:2007-03-01 10:05:5129楼 得分:0
qqchen79(知秋一叶)     回答我觉得比较好

装箱和拆箱   就是把值类型转为引用形或把引用形转为值,就是为了通用,但是会影响效率。虽然书上说尽量减少使用,其实大部分情况下不计较这个。因为如把一个方法的参数设置为object实在太方便。
发表于:2007-03-01 10:10:5030楼 得分:0
装箱,就是把值转为引用类型.
反之引用转为值.
发表于:2007-03-01 10:21:2231楼 得分:0
当做项目用到时,就知道它们之间的用处了!
发表于:2007-03-01 10:31:0732楼 得分:0
object     就是箱
发表于:2007-03-01 10:32:3033楼 得分:0
泛型很爽
发表于:2007-03-01 10:56:1434楼 得分:0
通过实用中对装拆箱的理解,它对大的好处就是可以减少方法的重载次数...
发表于:2007-03-01 10:57:1135楼 得分:0
qqchen79(知秋一叶)   (   )   信誉:171      

第一次看到性欲这么高的人,佩服!!!!!!!!!!!!!!!!!!!!!!!!!!
发表于:2007-03-01 11:39:5836楼 得分:0
to   bingbingcha(不思不归,不孟不e,原来是头大灰狼)

我不明白的问题就在于     string   s   =   10.tostring()

10   仅仅是个栈上的整型变量,如何能调用int   的tostring   方法呢?
之所以这样就是说10   也是一个int类型的对象,int   也是派生于object

如此来说不管是其他类还是基本类型代表的类,其实全部是派生于object的类,只不过他们存储的位置有所不同而已,基本类型存储在栈上而其它类对象存储在堆上

是这样吗?
发表于:2007-03-01 12:31:0837楼 得分:20
是的..所以说值类型要比引用类型快的地方就是在这里..

引用类型也就类似c/c++中的指针....c/c++的做法声明一个指针指向一个数据所在的地址..

引用类型是声明一个类型,分配数据存储的地址,然后指向这个地址..
发表于:2007-03-01 12:41:4638楼 得分:0
性能,安全。。。


快速检索

最新资讯
热门点击