装箱拆箱

原创 2007年10月01日 10:29:00
我原来对于装拆箱的理解只是停留在将值类型转化为Object类型,然后再转换回来。实际上,在这个看似简单的问题上还有一层更深的含义。
值类型和引用类型在实例化的时候是存储在不同的空间中的,值类型存储在Stack上,而引用类型是存储在Heap上,在装箱的过程中实际上是将在Stack上的值类型对象拷贝到Heap上,并以引用对象的存储格式保存,在这个过程中对所转换的引用类型对象进行修改操作,Stack上的值类型对象是不会变化的。而拆箱是将引用对象的值在拷贝回Stack上。
下面我们来看一个例子:
首先需要一个值类型,让它继承自一个接口
public interface IAdjustor
    {
        void Adjust();
    }
 
    public struct Size : IAdjustor
    {
        public int height;
        public int weight;
        public void Adjust()
        {
            height += 2;
            weight += 3;
        }
 }
然后,再用ClientApp测试一下:
class Program
    {
        static void Main(string[] args)
        {
            Size s = new Size();
            s.Adjust();
            Console.WriteLine("height:" + s.height + " weight:" + s.weight);
            IAdjustor itf = s; //In box
            itf.Adjust();
            Console.WriteLine("height:" + s.height + " weight:" + s.weight);
            s = (Size)itf;      //Un box
            Console.WriteLine("height:" + s.height + " weight:" + s.weight);
            Console.Read();
        }
 }
    输出结果如下:
height:2 weight:3
height:2 weight:3
height:4 weight:6
从结果不难看出,在装箱后IAdjustor itf = s,调用已为引用对象的Adjust()方法,相应的值类型对象并没有发生变化。在拆箱后s = (Size)itf;,值类型对象就变化了
 

Java的自动装箱,拆箱

Java的自动装箱与拆箱 --模范青蛙   学Java的都知道Java语言是面向对象的,可以有没有考虑过这样一个问题 Integer i=1;这里的i算是一个对象吗?我们的对象不都是new()出来的吗...
  • mo_fan_qing_wa
  • mo_fan_qing_wa
  • 2015年08月23日 10:47
  • 278

C# - 再谈C#的装箱和拆箱

上一篇写了一下装箱拆箱的定义和IL分析,这一篇我们看下使用泛型和不使用泛型引发装箱拆箱的情况 1. 使用非泛型集合时引发的装箱和拆箱操作  看下面的一段代码: 1 2 3 ...
  • honey199396
  • honey199396
  • 2016年08月31日 11:35
  • 532

Java自动装箱机制和自动拆箱机制

Java的自动装箱和自动拆箱功能 首先得注意基本数据类型和类的区别,也就是Integer和int的区别。注意容器中加入的都是类的对象而不是基本数据类型。故需要先将基本数据类型打包成对象。 Inte...
  • sun_wangdong
  • sun_wangdong
  • 2015年01月29日 22:09
  • 1107

装箱和拆箱存在的意义介绍

装箱和拆箱存在的意义:值类型是数据的容器,它存储在堆栈上,不具备多态性,而.NET框架在整个对象层次的设计中,使用System.Object作为所有类型的基类,但是Obejct是引用类型,而作为值类型...
  • ershouyage
  • ershouyage
  • 2012年06月04日 09:36
  • 963

关于装箱拆箱为什么会影响效率

概念 装箱在值类型向引用类型转换时发生,在堆中分配。 拆箱在引用类型向值类型转换时发生。 示例装箱 public void BoxIn() { ...
  • Admin_Jhon
  • Admin_Jhon
  • 2016年10月20日 15:55
  • 819

C#装箱和拆箱(Boxing 和 UnBoxing)

1、什么是装箱和拆箱? 简单来说:       装箱是将值类型转换为引用类型 ;拆箱是将引用类型转换为值类型。(网上广为流传)  C#中值类型和引用类型的最终基类都是Object类型(它本身是一个引用...
  • qiaoquan3
  • qiaoquan3
  • 2016年05月17日 21:44
  • 2944

【面试题】java装箱拆箱引发的思考

问题一:装箱拆箱举例 问题二、八种基本类型的包装类中的常量池与否 问题三、boolean和Boolean的区别 问题四、衍生的String的问题: 1. equals和==的区别? 2. String...
  • haibo_bear
  • haibo_bear
  • 2016年12月04日 15:55
  • 608

用实例深入理解装箱、拆箱

 学习.NET的过程中,发现大多数的书都讲到了装箱(boxing)和拆箱(unboxing)的概念,至于为什么要理解装箱和拆箱?则总是一句话带过: 优化程序的性能云云。至于为什么会对程序的性能产生影响...
  • comeon_data
  • comeon_data
  • 2008年04月09日 21:08
  • 443

java 装箱拆箱

装箱就是 自动将基本数据类型转换为包装器类型;拆箱就是 自动将包装器类型转换为基本数据类型。 下表是基本数据类型对应的包装器类型:int(4字节) Integer byte(1字节) B...
  • Super_Anna
  • Super_Anna
  • 2016年08月27日 16:00
  • 177

ios学习路线—Objective-C(装箱和拆箱)

概述 从前面的博文我们也可以看到,数组和字典中只能存储对象类型,其他基本类型和结构体是没有办法放到数组和字典中的,当然你也是无法给它们发送消息的也就是说有些NSObject的方法是无法调用的,这个时...
  • dubo413392749
  • dubo413392749
  • 2016年06月15日 13:51
  • 281
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:装箱拆箱
举报原因:
原因补充:

(最多只允许输入30个字)