.Net装箱拆箱编程实例


装箱是将值类型转换为引用类型 ;拆箱是将引用类型转换为值类型。
利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类型链接起来。

由于C#中所有的数据类型都是由基类System.Object继承而来的,所以值类型和引用类型的值可以通过显式(或隐式)操作相互转换,而这转换过程也就是装箱(boxing)和拆箱(unboxing)过程。


装箱是将值类型转换为 object 类型或由此值类型实现的任何接口类型的过程。当 CLR 对值类型进行装箱时,会将该值包装到 System.Object 内部,再将后者存储在托管堆上。取消装箱将从对象中提取值类型。装箱是隐式的;取消装箱是显式的。装箱和取消装箱的概念是类型系统 C# 统一视图的基础,其中任一类型的值都被视为一个对象。

相对于简单的赋值而言,装箱和取消装箱过程需要进行大量的计算。对值类型进行装箱时,必须分配并构造一个新对象。取消装箱所需的强制转换也需要进行大量的计算,只是程度较轻。

装箱用于在垃圾回收堆中存储值类型。装箱是值类型到 object 类型或到此值类型所实现的任何接口类型的隐式转换。对值类型装箱会在堆中分配一个对象实例,并将该值复制到新的对象中。

取消装箱是从 object 类型到值类型或从接口类型到实现该接口的值类型的显式转换。取消装箱操作包括:
    检查对象实例,以确保它是给定值类型的装箱值。
    将该值从实例复制到值类型变量中。

三 编程实例

1 演示正常的装箱拆箱

using System;

// boxing.cs
// Boxing an integer variable

class TestBoxing  
{
   public static void Main() 
   {
      int i = 123;
      object o = i;  // Implicit boxing
      i = 456;       // Change the contents of i
      Console.WriteLine("The value-type value = {0}", i);
      Console.WriteLine("The object-type value = {0}", o);
      
      //装箱和取消装箱操作:
int i2 = 123;          // A value type
object box = i2;       // Boxing
int j2 = (int)box;     // Unboxing
Console.WriteLine(box);
Console.WriteLine(j2);
      
      Console.Write("按任意键继续 . . . ");
Console.ReadKey(true);
   }
}

运行截图;

2 正常的装箱拆箱和拆箱发生异常时捕获到异常

using System;
public class UnboxingTest 
{
   public static void Main() 
   {
      int intI = 123;

// Boxing
      object o = intI;

// Reference to incompatible object produces InvalidCastException
      try 
      {
         int intJ = (short) o;
         //int intJ = (int) o;
         Console.WriteLine("Unboxing OK.");
         Console.Write("按任意键继续 . . . ");
Console.ReadKey(true);
      }

catch (InvalidCastException e) 
      {
         Console.WriteLine("{0} Error: Incorrect unboxing.",e);
         Console.Write("按任意键继续 . . . ");
Console.ReadKey(true);
      }
   }
}

上述程序分别把上面一句 int intJ定义语句和下面一句int intJ定义语句注释掉的运行截图分别如下;

工程源码:

http://pan.baidu.com/s/1dDs7jdn

.Net装箱拆箱编程实例相关推荐

  1. 反射、装箱拆箱、ArrayList与Array的区别 - 天生舞男 - 博客园

    反射.装箱拆箱.ArrayList与Array的区别 Posted on 2005-09-11 23:11 天生舞男 阅读(125) 评论(0) 编辑 收藏 引用 网摘 所属分类: SPS 1 什么是 ...

  2. 6个重要的.NET概念:栈,堆,值类型,引用类型,装箱,拆箱

    引言 本篇文章主要介绍.NET中6个重要的概念:栈,堆,值类型,引用类型,装箱,拆箱.文章开始介绍当你声明一个变量时,编译器内部发生了什么,然后介绍两个重要的概念:栈和堆:最后介绍值类型和引用类型,并 ...

  3. CLR via C# 中关于装箱拆箱的摘录

     装箱: 为了将一个值类型转换成一个引用类型,要使用一个名为装箱(boxing)的机制.下面总结了对值类型的一个实例进行装箱操作时在内部发生的事情. 1.在托管堆中分配好内存.分配的内存量是值类型的各 ...

  4. java自动装箱拆箱深入剖析

    这个是jdk1.5以后才引入的新的内容,作为秉承发表是最好的记忆,毅然决定还是用一篇博客来代替我的记忆:  java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的(在这种情况下包装成为装 ...

  5. java装箱拆箱_Java中的自动装箱与拆箱

    自动装箱和拆箱从Java 1.5开始引入,目的是将原始类型值转自动地转换成对应的对象.自动装箱与拆箱的机制可以让我们在Java的变量赋值或者是方法调用等情况下使用原始类型或者对象类型更加简单直接. 如 ...

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

    概念 示例 装箱 拆箱 结论 概念 装箱在值类型向引用类型转换时发生,在堆中分配. 拆箱在引用类型向值类型转换时发生. 示例 装箱 public void BoxIn(){object tempObj ...

  7. Java自动装箱/拆箱 - Java那些事儿

    昨天Java基本数据类型和引用类型一文中漏了几张图,已经补上,需要的自己回头去看,本系列文章首发于公众号:saysayJava. 在让人疑惑的Java代码 - Java那些事儿 一文中我们说到编译器自 ...

  8. C#装箱,拆箱和强制转换(转)

    出处:https://www.cnblogs.com/fengjiulin110120/p/6605739.html 关系: 强制转换就包含有装箱拆箱操作,装箱就是把值类型转换成引用类型,反之就是拆箱 ...

  9. Java基础笔记 – 增强的for循环For each循环 自动装箱拆箱 可变参数

    1.For each循环:1.1.语法:1.2.For each循环的使用:1.3.嵌套For each循环:1.4.三种循环遍历集合的列举:1.5.增强的for循环的缺点:2.自动装箱/拆箱(Aut ...

最新文章

  1. Android studio怎么找到当前文件在电脑路径位置
  2. Redis 数据结构的底层实现 (二) dict skiplist intset
  3. 1026:空格分隔输出
  4. java pgp_Java相当好的隐私(PGP)
  5. pssh批量远程管理
  6. MFC开发IM-第二十七篇、如何引入acl,解决Json解析问题
  7. 【Flink】Flink SQL 架构 以及 执行逻辑
  8. 贷后风控中逾期案件差异化的分配逻辑
  9. 珠海 第十届亚洲机器人锦标赛_滨和中学“VEX”团队斩获粤港澳机器人大赛多个大奖!...
  10. Java学习笔记之方法
  11. 电脑雕刻教程_C4D无敌渲染神器! 阿诺德全套预设+案例教程+3.0汉化插件合集!真香!【810期】...
  12. CakePHP 3.7.6 发布,PHP 快速开发框架
  13. SpringCloud Ribbon的分析
  14. PureLayout,使用纯代码写AutoLayout
  15. 值得收藏的50个学习C语言的源代码网站
  16. Jackson的JSON——JsonUtils工具类
  17. Python:输入概率,计算信源熵
  18. Win10正式版微软官方原版ISO系统镜像下载大全
  19. 【转载】Windows 7下使用bcdedit删除多余启动项的命令
  20. SOCKS5实现(一)

热门文章

  1. shiro.ini实现授权
  2. mysql实现汉字转拼音
  3. Linux 技术篇-查看cpu核心数,grep常用信息筛选语法使用演示
  4. python 技术篇-logging模块的日志定期清理设置,自动清理上个月的日志实例演示
  5. Mac 技术篇-pip下载速度慢解决办法,pip秒速下载,阿里云镜像配置
  6. leetCode C++ 二分查找 35. 搜索插入位置 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
  7. C++类里面的哪些成员函数是内联函数?
  8. SSD算法 模板 匹配
  9. TensorFlow安装【2018/12更新】+文档查询以及栏目配置(Windows)
  10. 性能优化:实现动画效果优先考虑css的transition