日期:2014-05-18  浏览次数:20843 次

初学.net,问一简单问题(装箱和拆箱)
看了教程,对装箱和拆箱有点明白,但想问下在实际编程有什么用途...
望各位大侠来讨论,最好是能举一两个实际应用中的例子,谢谢.

------解决方案--------------------
http://www.moon-soft.com/doc/14671.htm

写程序的时候尽量避免频繁的装箱和拆箱
------解决方案--------------------
装箱拆箱最好不要用,2.0有泛型感念后,装箱拆箱用的已经很少了
------解决方案--------------------
如果你知道装箱和拆箱的概念,你就该知道频繁的转拆箱是对性能上有损耗的(占用内存)

在我们写的代码中是经常出现这样的东西的

Session[ "aa "] = 5; //装箱
int i = Convert.ToInt32(Session[ "aa "]); //拆箱


------解决方案--------------------
以前看过的资料,感觉还不错
http://www.cnblogs.com/adbosl/archive/2006/05/15/400533.aspx
------解决方案--------------------
简单的例子
public class Buffer
{
private ArrayList ary;

public void Append(object obj)
{
ary.Add(obj);
}
public object Get(int index)
{
return ary[index];
}
}

这里传入的是object类型,也就是说,如果需要使用这个Append,就需要把类型转化为object。比如
int i = 1;
Buffer buff = new Buffer();
buff.Append((object)i);

而在取出的时候,返回的也是object,需要转化为相应的类型。比如
int j = (int)buff.Get(0);

这里注意转化的类型要正确,不然会出现错误。比如,原来存进去的object是TextBox类型,你拿出来以后,强制转化为int,就会有错误发生。
------解决方案--------------------
应该用泛型取代了
------解决方案--------------------
因为座位紧张,所以把LZ当成货物运送。。。

到达目的地后再从货舱里拉出来。。。

当然,要把lz打得不成人形,然后再整会人形是需要开销的。。。
------解决方案--------------------
从用处角度来看 提供了宽松的接口,但性能会下降。很少使用

------解决方案--------------------
装箱就是将值类型转换为引用类型
拆箱就是将引用类型转换为值类型

写程序时少不了做这些转换操作,用也不会太影响性能,但如果是太频繁的装拆箱就要考虑一下用泛型代替
------解决方案--------------------
好比说arraylist就是标准的装箱操作。
myclass mc = new myclass();
arraylist arr = new arraylist();
arr.add(mc);//装箱放入列表中
myclass result = (myclass)arr[0];//强制转换拆箱

当你一个列表中需要放入多种类型的数据的时候,就要用到这个了。

单一类型就用范型操作就好了。

list <int> arr = new list <int> ();
这样取出arr[0]的时候,就不需要强制转换来拆箱了。
------解决方案--------------------
如果不考虑程序的效率,可以放弃这两个概念
如果考虑程序的效率,就要避免装箱
------解决方案--------------------
不简单的说,所有的值类型对象都是直接预订内存的,而所有的引用类型对象都是用malloc动态分配内存的,所以每装箱一次,就会损耗一定的内存。
比方说,一个int,在栈区只分配了4个字节,如果装箱的话,简单来算,就会变成4+他自己的指针4+父类object的指针4+堆索引4+动态内存位置记忆4=20字节。然后计算机需要对这个20字节作清零操作。不用的时候计算机还需要作很多的垃圾回收工作....

所以为了我们亲爱的计算机兄弟减少工作量,为了我们美丽的地球节约资源,
请慎用装箱!!!
------解决方案--------------------
但想问下在实际编程有什么用途...

======

要是,可以,我宁愿不进行 装箱/拆箱(box/unbox)

无法说有什么用途,而是因为C#讲类型分为 值类型(继承自System.ValueType)与引用类型,当两种类型进行互相转换的时候,就引出了装、拆箱的概念,

相关信息 ->

C# 中内存分配,
值类型 分配在堆栈上
引用类型 分配在托管堆上

box/unbox 会导致额外的类型损失

类型转换与性能相关典型应用示例
ADO.NET 中 xxxDataReader 读取的各种方式性能差别
以下序号阅大,性能月底

1. DataReader.GetXXX( < <ColumnIndex> > )

2. DataReader.GetXXX(Dictionary <string, int> [ < <ColumnName> > ])
[Dictionary <string, int> .Add( < <ColumnName> > , DataReader.GetOrdinal( < <ColumnName> > ))]

3. DataReader.GetXXX((Int32)Hashtable[ < <ColumnName> > ])