日期:2014-05-19  浏览次数:20893 次

装箱拆箱的问题
装箱是将值类型转换为引用类型,拆箱是将引用类型转为值类型。
这样说对吗?

------解决方案--------------------
对的,意思是这样的
装箱:
int a = 1;
object obj = a;

拆箱:
int a = (int)obj;
------解决方案--------------------
不准确!
装箱:值类型到object类型或到此值类型所实现的任何接口类型的隐式转换
拆箱:从object类型到值类型或从接口类型到实现该接口的值类型的显式转换
引用类型包括object,class,string,interface,delegate
------解决方案--------------------
那说说,为什么 C++ 和 Java 都有没有 boxing 和 unboxing 的概念吧,为什么 C# 偏偏要设计一个值类型出来?
---------------
性能...当然是为了性能...不过装拆箱对性能的影响更偏重于大型的程序和软件...
另外就是安全...值类型在编译时就指定了内存分配的大小并由系统自动释放...

值类型和引用类型在实例化的时候是存储在不同的空间中的,值类型存储在Stack上,而引用类型是存储在Heap上,在装箱的过程中实际上是将在Stack上的值类型对象拷贝到Heap上,并以引用对象的存储格式保存,在这个过程中对所转换的引用类型对象进行修改操作,Stack上的值类型对象是不会变化的。而拆箱是将引用对象的值在拷贝回Stack上...

理解了装拆箱和Stack、Heap之间的关系你就明白为什么了...