所谓装箱就是装箱是将值类型转换为 object 类型或由此值类型实现的任一接口类型的过程。而拆箱就是反过来了。很多人可能都知道这一点,但是是否真的就很了解boxing和unboxing了呢?可以看下下面一段代码,里面发生了几次装箱过程?

public static void Main(string[] args)
{
Int32 v = ;
Object o = v;
v = ;
Console.WriteLine(v+" , "+(Int32)o);
}

不少人可能认为只有一次装箱,其实里面发生了3次装箱过程,是不是很意外!
  第一次很明显,就在 Object o = v;时发生。
  第二次和第三次都是发生在Writeline()方法里面了。调用此方法是要求获取一个String对象,但是,当前没有字符串对象,它只有三个数据项可以用:一个未装箱的Int32值类型的实例(v),一个String(是一个引用类型),以及一个已经装箱的Int32值类型实例的引用(o),它需要转化成一个未装箱Int32的值类型。所以必须以某种方式对这些数据进行合并,以创建一个String。

  为了创建String,C#编译器会生成代码来调用String对象的静态方法Concat。这个方法有好几个重载版本,由于需要把三个数据项连接起来,所以编译器选择的是:

public static string Concat(
Object arg0,
Object arg1,
Object arg2
)

  为第一个参数arg0传入的是值类型v,但arg0是一个Object,所以必须对v进行装箱,并将已经装箱的v的地址传给arg0。为arg1参数传递的是一个" , ",它本质上是一个String对象的引用,无需装箱。最后对于arg2,o(一个Object对象的引用)会转换成一个Int32,这要求执行一次拆箱操作(但不紧接着执行一次复制操作),从而获取在已装箱Int32中未装箱的Int32的地址。这个未装箱的Int32实例必须再次装箱,并将新的已装箱实例的地址传给Concat的arg2参数。

  然后Concat调用指定的每个对象的TosSring方法,并连接每个对象的字符串表示,最终由WriteLine方法显示出来。

 

你真的了解装箱(Boxing)和拆箱(Unboxing)吗?的更多相关文章

  1. 【C#】 装箱 (boxing) 和拆箱 (unboxing)

    目录: 1. 装箱和拆箱 2. 深入理解装箱和拆箱 3. int[] to object[],值类型数组到对象数组的转化 4. 使用泛型减少装箱和拆箱 1.  装箱和拆箱 装箱 就是把“值类型”转换成 ...

  2. C#中的装箱(inboxing)和拆箱(unboxing)(简单理解)

    装箱和拆箱是值类型和引用类型之间相互转换是要执行的操作.  装箱:将一个值类型隐式地转换成一个object类型,或把这个值类型转换成一个被该值类型应用的接口类型,把一个值类型的值装箱,就是创建一个ob ...

  3. Java语法糖2:自动装箱和自动拆箱

    前言 一开始想学学自动拆箱和自动装箱是被这个名字吸引到,听上去好像很高端的样子,其实自动拆箱.自动装箱是很简单的内容. 自动拆箱和自动装箱 Java为每种基本数据类型都提供了对应的包装器类型.举个例子 ...

  4. java 自动装箱、自动拆箱

    /** * @描述:自动装箱,自动拆箱 * @date 2017年1月10日下午1:30:01 * 结论:包装类的"=="运算在不遇到算术运算的情况下不会自动拆箱, * 以及他们的 ...

  5. java基础40 可变参数、自动装箱和自动拆箱

    一.可变参数 可变参数是jdk1.5新特性 1.1.可变参数的格式 数据类型...变量名 // 数据类型...变量名public static void sum(int...arr){ } 1.2.可 ...

  6. JavaSE的包装类,自动装箱和自动拆箱 ,字符窜转换,toString(),equals(), hashCode()的区别

    一.基本数据类型和包装类 包装类均位于Java.lang包,包装类和基本数据类型的对应关系如下表所示: Primitive-Type   Wrapper-Class        byte       ...

  7. Java连载77-Integer常用方法、Integer、int、String三者相互转化、自动装箱、自动拆箱

    一.关于Integer中常用的方法 package com.bjpowernode.java_learning; ​ public class D77_1_ { public static void ...

  8. jdk1.5新特性之-----自动装箱与自动拆箱

    import java.util.ArrayList; /* jdk1.5新特性之-----自动装箱与自动拆箱. java是面向对象 的语言,任何事物都可以使用类进行描述,sun就使用了 一些类描述j ...

  9. 自动装箱与自动拆箱——JavaSE基础

    自动装箱与自动拆箱 自动装箱与拆箱就是编译器蜜糖(Compiler Sugar) Integer a = 234; // 自动装箱,实际上是Integer a = Integer.valueOF(23 ...

随机推荐

  1. 写一个system.data.entity的simpledatarepo,实现crudq这些功能,不需要引入entityframework,直接可以使用,用到objectset

    note:you can delete reference of entityframework when using this classes.it`s just a simple repohelp ...

  2. SSM+redis整合(mybatis整合redis做二级缓存)

    SSM:是Spring+Struts+Mybatis ,另外还使用了PageHelper 前言: 这里主要是利用redis去做mybatis的二级缓存,mybaits映射文件中所有的select都会刷 ...

  3. suse10与suse11连接Xmanager的配置

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://feidandelion.blog.51cto.com/1050439/42217 ...

  4. 掌握 Linux 调试技术【转】

    转自:https://www.ibm.com/developerworks/cn/linux/sdk/l-debug/index.html 您可以用各种方法来监控运行着的用户空间程序:可以为其运行调试 ...

  5. tcpreplay 缓存算法研究

    一.  缓存算法 1.1  算法目的 流量拆分算法的运算会明显影响包的发送速率,为了提高发送速率, tcpreplay 使用了缓存机制,该部分代码也封装在tcpprep工具里,运行 tcpprep ( ...

  6. springBoot开启热部署

    springBoot开启热部署 这里使用devtools工具开启热部署 〇.搭建springbboot基础环境 一.添加依赖 <dependency> <groupId>org ...

  7. 应用程序已被Java安全阻止

    提示 您的安全设置已阻止自签名的应用程序运行 控制面板-JAVA-安全-例外站点-https://域名或IP/或http://域名或IP/,注意结尾必须要加/否则还是会一直提示被阻止

  8. python--bs4

  9. 【原创】BI解决方案选型之ETL数据整合工具对比

    一.背景 在企业BI平台建设过程中,数据整合始终是一切的基础,简单BI项目可以通过存储过程来实现,而复杂.全面.多方异构数据来源等就大大增加了复杂性,存储过程的可管理性.可维护性.容错性等就无法很好的 ...

  10. 给object数组进行排序(排序条件是每个元素对象的属性个数)

    从汤姆大叔的博客里看到了6个基础题目:本篇是第3题 - 给object数组进行排序(排序条件是每个元素对象的属性个数) 解题关键: 1.Array.sort的用法 2.object的属性数量的统计 解 ...