所谓装箱就是装箱是将值类型转换为 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. 渗透协作工具 dradis centos安装

    https://dradisframework.com/ce/documentation/install_centos.html yum install rubygems 安装的bundle在drad ...

  2. opengl glEnableClientState() 和 glDisableClientState() 作用

    http://zhidao.baidu.com/link?url=c3m55lgpjhU1Rb7TEP-aTGQAX3-GrcBk5NaUC2UA1ZtQiCCtHJzB_KoG7pWvPEybfYv ...

  3. Linux/Android——input_handler之evdev (四) 【转】

    转自:http://blog.csdn.net/u013491946/article/details/72638919 版权声明:免责声明: 本人在此发文(包括但不限于汉字.拼音.拉丁字母)均为随意敲 ...

  4. [转]Google 的开源技术protobuf 简介与例子

    本文来自CSDN博客:http://blog.csdn.NET/program_think/archive/2009/05/31/4229773.aspx 今天来介绍一下“Protocol Buffe ...

  5. POCO库中文编程参考指南(4)Poco::Net::IPAddress

    POCO库中文编程参考指南(4)Poco::Net::IPAddress 作者:柳大·Poechant 博客:Blog.CSDN.net/Poechant 邮箱:zhongchao.ustc#gmai ...

  6. memset和wmemset用法记录

    char cBuffer[50] ;TCHAR wBuffer[50]; 1.将cBuffer初始化为空格memset(cBuffer, ' ', sizeof(cBuffer));第三个参数为字节数 ...

  7. Javascript短路表达式

    短路表达式:作为"&&"和"||"操作符的操作数表达式,这些表达式在进行求值时,只要最终的结果已经可以确定是真或假,求值过程便告终止,这称之为短 ...

  8. 在MSSQL中将数字转换成中文

    具体代码如下: CREATE FUNCTION [dbo].[fn_NumberToChinese] (@number INT) ) AS BEGIN ); ); ); SET @res = ''; ...

  9. asp.net 网站模板怎么用,就是16aspx上面下下来的模板,里面有个sln文件,其他全是文件夹的东西

    .net写的程序模板一般都被写死了.那样只有通过程序改了.

  10. Go的50坑:新Golang开发者要注意的陷阱、技巧和常见错误[2]

    初级篇 开大括号不能放在单独的一行 未使用的变量 未使用的Imports 简式的变量声明仅可以在函数内部使用 使用简式声明重复声明变量 偶然的变量隐藏Accidental Variable Shado ...