`

BOXING AND UNBOXING FOR BEGINNER

阅读更多
看了CODEPROJECT上篇讲BOXING的文章,觉得不错,故翻译并修改理顺之,对beginner(比如本人)是个不错的选择

    首先,C#(JAVA也是),将类型分为值类型(value type)和引用类型(reference type).

VALUE TYPE
      值类型的数据放在堆栈中的,用来存放固定长度的数据,如INT。每个程序在运行时都有自己的堆栈,其他程序不能访问。所有的value type都是继承自system.valuetype.常见的如简单类型的数(INT,DOUBLE。。)和复合类型(枚举,结构)。

引用类型:
    引用类型的数放在堆(HEAP)里,存放可变长度的数据,没有预先指定大小,,如数组,接口,委托,类等,都属于引用类型。
下面举例子说明:

    比如, System.ValueType r = 5;,这样的写法是成立的,自动匹配认为r的类型是int32,
   如果用Console.WriteLine(r.GetType()) ;,可以清楚看到R的类型;
什么是BOXING(装箱)呢?
   boxing,就是将值类型转变为引用类型的过程,比如
          Int32 x = 10;
        object o = x ;  //隐式转换
        Console.WriteLine("The Object o = {0}",o); //输出10
        //-----------------------------------------------------------
        Int32 x = 10;
        object o = (object) x; // 显式转换
        Console.WriteLine("The object o = {0}",o); // prints out 10

    上面的例子可以看到,一个int32类型的值10,通过object o=x;进行隐式的BOXING,转变为引用类型,而通过object o=(object)x,这样进行的是显式转换,结果一样。注意,隐式转换是编译器自动进行的。
  
什么是UNBOXING(拆箱)呢?
   比如:
          
        Int32 x = 5;
        object o = x; // 隐式BOXING
        x = o; // 隐式UNBOXING
  就是将引用类型转换为值类型。
    当然,上面也可以这样写,用显式unboxing:
        Int32 x = 5;
        object o = x; 
        x = (Int32)o; 
   要特别注意的是,在unboxing中,如果象下面那样
    Int32 x = 5; 
        Int64 y = 0; 
        object o = x; 
        y = (Int64)o; 
        Console.WriteLine("y={0}",y); 
这样编译起来,会出现System.InvalidCastException异常,因为x的值在boxing为32位值后,必须unboxing为32位.当然,可以在unboxing为32位后,再强制转换为64位,如
 y = (Int64)(Int32)o;
 
   还要特别注意的是,在unboxing时,要确保得到的值变量有足够的空间存储所有的字节,比如
   long a=123323456;
  object c=(object)a;
 int d=(int)c;
 会出现错误,因为64位的值A先BOXING为引用类型,存储在堆上,再unboxing为32位值int,则因为D没空间存储值而出错
  


        

        

   
   
分享到:
评论

相关推荐

    XinYe95#Java-Learning#64. 自动装箱和拆箱(Auto-boxing & Unboxing)1

    1. 自动装箱: 2. 自动拆箱: 3. 缓存问题

    JavaScript装箱及拆箱boxing及unBoxing用法解析

    在JavaScript中,装箱(boxing)和拆箱(unboxing)是两个重要的概念,它们涉及到基本数据类型和引用数据类型之间的转换。基本数据类型包括Number、String、Boolean、null、undefined,而引用数据类型主要是Object,...

    boxing-unboxing-java-perf:在 Java 中展示 BoxingUnboxing 性能的基准测试

    装箱/拆箱与封装:Java 的Map<Something> 问题:我想要一个将整数存储为其值的映射。 现在我有两种方法: 使用任何东西作为键和Integer (非原始整数)作为值,或使用任何东西作为键和一个包含int (原始整数)作为...

    C++/CLI Primer: For .NET Development

    Implement code that uses boxing/unboxing Use equality/identity, properties, enums, strings, arrays, and more Who This Book Is For Experienced Microsoft .NET application developers, familiar with ...

    C++ CLI Primer(Apress,2016).pdf

    Implement code that uses boxing/unboxing Use equality/identity, properties, enums, strings, arrays, and more Who This Book Is For Experienced Microsoft .NET application developers, familiar with ...

    C#语言参考 陈广36-39 完

    37章继续深入装箱与拆箱,通过BoxingAndUnboxing(2).swf文件可能提供了更多示例和实践案例,帮助开发者避免常见的陷阱和误区,比如不正确的类型转换可能导致的NullReferenceException。 38章转向了范型(Generic)...

    Addison.Wesley.The.Java.Programming.Language.4th.Edition.Aug.2005.chm

    Chapter 8Primitives as Typesexplores the relationship between the primitive types and objects of their corresponding wrapper classes, and how boxing and unboxing can transparently convert between ...

    陈广C#程序设计入门与实例视频教程35-38.rar

    - `36-boxing&unboxing(1).swf`和`37-boxing&unboxing(2).swf`详细阐述了C#中的装箱和拆箱操作。装箱是将值类型转换为对象的过程,而拆箱则是相反的过程。装箱用于将值类型存储在对象堆上,以便可以存储在引用类型...

    Android-boxing基于MVP模式的Android多媒体选择器

    【Android-boxing】是一个专为Android平台设计的多媒体选择器库,它采用了现代软件开发中的Model-View-Presenter(MVP)模式,旨在提供一种高效、灵活的方式来处理用户在应用程序中选择图片和视频的需求。...

    unity3d 游戏源码 Boxing Game Starter Kit 拳击项目包 资源.zip

    《Unity3D游戏开发:Boxing Game Starter Kit详解》 Unity3D作为一款强大的跨平台游戏引擎,被广泛应用于各种游戏类型的开发,其中包括了动作、竞技等类型。本篇文章将详细解析“Boxing Game Starter Kit”这个拳击...

    Effective C# 2ed (Covers C# 4.0)

    Minimize garbage collection, boxing, and unboxing (see Items 16 and 45) Take full advantage of interfaces and delegates (see Items 22 though 25) Make the most of the parallel framework (see Items 35...

    jsLinb —— 一个不错误的js框架(兼容jQuery, prototype, mootools等其他框架)

    压缩的核心代码仅仅50k,包括了javascript类型检查,强制类型,精密且灵活的事件模型,自定义事件,observer和tie/untie,boxing/unBoxing/reBoxing模型,直接调用,dom生成,查询,遍历和操作,css样式操作,css类...

    html5小游戏【3d boxing拳击游戏】源代码免费分享

    html5小游戏【3d boxing拳击游戏】源代码免费分享html5小游戏【3d boxing拳击游戏】源代码免费分享html5小游戏【3d boxing拳击游戏】源代码免费分享html5小游戏【3d boxing拳击游戏】源代码免费分享html5小游戏【3d ...

    基于MVP模式的Android多媒体选择器boxing.zip

    boxing 是 Bilibili 开源的基于 MVP 模式的 Android 多媒体选择器。特性支持多/单图片选择和预览,单图裁剪功能支持gif支持视频选择功能提供图片压缩支持自定义UI预览图  标签:boxing

    Boxing.zip

    Boxing.zip是一个包含基于51单片机姿态检测程序的压缩包,主要涉及IIC通信协议来读取MPU6050六轴陀螺仪/加速度计的数据,并通过串口将这些数据输出。这个项目的核心是实现对物体或设备姿态的实时监测,对于机器人...

Global site tag (gtag.js) - Google Analytics