目录

C# 的“装箱”和“拆箱”;

1.装箱

2.拆箱

使用拆箱操作时出现的错误


C# 的“装箱”和“拆箱”;

C#语言类型系统中有两个重要的概念,分别是装箱和拆箱,通过装箱和拆箱,任何值类型都可以被当作 object 引用类型来看。

1.装箱

装箱,实质上就是将之类型转换为引用类型。

例:

创建一个控制台应用程序,声明一个整型变量 i 并赋值为2020,然后将其复制到装箱对象 obj 中,最后改变变量 i 的值。

using System;namespace lian__xi
{class Program{static void Main(string[] args){int i = 2020;           //声明一个int类型变量i,并初始化为2020;object obj = i;         //声明一个object类型的obj,其初始化值为;Console.WriteLine("1、i的值为{0},装箱之后的对象为{1}", i, obj);i = 331;                //重新将i赋值为331;Console.WriteLine("2、i的值为{0},装箱之后的对象为{1}", i, obj);Console.ReadLine();}}
}

运行结果:

1、i的值为2020,装箱之后的对象为2020
2、i的值为331,装箱之后的对象为2020

从程序运行结果可以看出,值类型变量的值复制到装箱得到的对象中,装箱后可以改变值类型变量的值,并不会影响装箱对象的值。

2.拆箱

拆箱,实质上就是将引用类型转换为值类型的过程。拆箱的执行过程可大致分为以下两个阶段:

  1. 检查对象的实例,看他是不是值类型的装箱值;
  2. 把这个实例的值复制给值类型的变量。

例:

创建一个控制台应用程序,声明一个整型变量 i 并赋值为112,然后将其复制到装箱对象 obj 中,最后进行拆箱操作将装箱对象 obj 赋值给整型变量 j 。

using System;namespace lian__xi
{class Program{static void Main(string[] args){int i = 112;                        //声明一个 int 类型的变量 i ,并初始化为 112;object obj = i;                     //执行装箱操作;Console.WriteLine("装箱操作:值为{0},装箱对象为{1}", i, obj);int j = (int)obj;                   //执行拆箱操作;Console.WriteLine("拆箱操作:装箱对象为{0},值为{1}", obj, j);Console.ReadLine();}}
}

运行结果:

装箱操作:值为112,装箱对象为112
拆箱操作:装箱对象为112,值为112

从程序运行结果可以看出,拆箱后得到的值类型数据的值与装箱对象相等。

注意:

在执行拆箱操作时,要符合类型一致的原则,否则会出现异常。

使用拆箱操作时出现的错误

拆箱是装箱操作的逆向操作,把引用类型的对象转换为对应的值类型的值,从内存中堆栈分配的角度来说,就是把堆中的对象复制到堆栈中。由于 System.Object 类型也是所有值类型的基类,所以在装箱的过程中,值类型都可以隐式地转换为System.Object 类型,并且一般不会存在隐患。但是在拆箱操作时需要特别注意处理不当,则会产生异常。

例:

using System;namespace stars
{class Program{static void Main(string[] args){Int32 i = 10;object obj = i;//省略装箱操作;//拆箱操作,易产生隐患;try{Int64 j = (Int64)obj;               //拆箱操作Console.WriteLine("拆箱成功");}catch (Exception ex){Console.WriteLine("拆箱失败!");Console.WriteLine("拆箱失败的原因!:{0}", ex.ToString());             }Console.ReadLine();}}
}

运行结果:

拆箱失败!
拆箱失败的原因!:System.InvalidCastException: Unable to cast object of type 'System.Object' to type 'System.Int64'.at stars.Program.Main(String[] args) in H:\VS源码\vs练习源码\stars\Program.cs:line 18

在上面的代码中,仔细查看拆箱的代码,由于Int64类型的取值范围要比 Int32 类型大的多,所以看起来把Int32 类型的值赋给Int64类型的变量应该不会错,但运行结果却出了问题,如上面的运行结果。

从运行结果看到,程序将抛出的一个 InvalidCastException 类型的异常,这个异常的含义是无效类型转换或显示转换引发异常。这就说明该异常是因被拆箱对象的最初类型与拆箱是的值类型不一致而产生的,同时也论证了拆箱市的一条原则,被拆箱对象的最初类型与拆箱是的值类型必须一致。

解决的办法也很简单,就是让拆箱对象的最初类型与拆箱是的类型保持一致,

修改后的关键代码如下:

 try{Int64 j = (Int64)(Int32)obj;               Console.WriteLine("拆箱成功!");}catch (Exception ex){Console.WriteLine("拆箱失败!");Console.WriteLine("拆箱失败的原因:{0}", ex.ToString());}

嗯这个是博主自己根据《C#自学视频教程》书中的内容自己总结的。如有不对,请大家留言。博主我会及时改正。

“装箱”和“拆箱”操作(有详细的代码案例和说明);相关推荐

  1. C# 如何避免装箱和拆箱操作

    Net的类型分为两种,一种是值类型,另一种是引用类型.这两个类型的本质区别,值类型数据是分配在栈中,而引用类型数据分配在堆上.那么如果要把一个值类型数据放到堆上,就需要装箱操作;反之,把一个放在堆上的 ...

  2. 包装类型与基本类型的装箱与拆箱操作

    文章目录 概述 Boolean 与 boolean Character 与 char Byte 与 byte Short 与 short Integer 与 int Float 与 float Dou ...

  3. 浅谈.NET中的类型和装箱、拆箱原理

    谈到装箱拆箱,大概的意思就是值类型和引用类型的相互转换呗---值类型到引用类型叫装箱,反之则叫拆箱.这当然没有问题,可是你只知道这么多,那么建议你花点时间看看楼主这篇文章 1. .NET中的类型 为了 ...

  4. Java包装类、装箱和拆箱

    Java 的设计中提倡一种思想,即一切皆对象.但是从数据类型的划分中,我们知道 Java 中的数据类型分为基本数据类型和引用数据类型,但是基本数据类型怎么能够称为对象呢?于是 Java 为每种基本数据 ...

  5. [CLR via C#]5.3 值类型的装箱和拆箱

    原文:[CLR via C#]5.3 值类型的装箱和拆箱 在CLR中为了将一个值类型转换成一个引用类型,要使用一个名为装箱的机制. 下面总结了对值类型的一个实例进行装箱操作时内部发生的事: 1)在托管 ...

  6. 1.1 Java包装类、装箱和拆箱

    在 Java 的设计中提倡一种思想,即一切皆对象.但是从数据类型的划分中,我们知道 Java 中的数据类型分为基本数据类型和引用数据类型,但是基本数据类型怎么能够称为对象呢?于是 Java 为每种基本 ...

  7. [C#] C# 知识回顾 - 装箱与拆箱

    装箱与拆箱 目录 生活中的装箱与拆箱 C# 的装箱与拆箱 值类型和引用类型 装箱 拆箱 读者见解 生活中的装箱与拆箱    我们习惯了在网上购物,这次你想买本编程书 -- <C 语言从入门到放弃 ...

  8. C#基础:理解装箱与拆箱

    .NET大牛之路 • 王亮@精致码农 • 2021.08.27 前面我们讲到 .NET 平台支持的两大数据类型:值类型和引用类型.值类型比引用类型更高效,因为它没有指针引用,不用分配在托管堆中,也不用 ...

  9. [019] C#基础:理解装箱与拆箱

    .NET大牛之路 • 王亮@精致码农 • 2021.08.27 前面我们讲到 .NET 平台支持的两大数据类型:值类型和引用类型.值类型比引用类型更高效,因为它没有指针引用,不用分配在托管堆中,也不用 ...

最新文章

  1. 半个月3篇Nature/Science,95后曹原3年8篇顶刊,网友:杀疯了杀疯了
  2. svn working copy locked
  3. 静态切割窗体+关联对话框
  4. oracle安装完成EM不能登录,oracle数据库不能登录em问题的解决方法
  5. Maven阿里云与本地仓库配置
  6. python数据建模工具_python数据分析工具——Pandas、StatsModels、Scikit-Learn
  7. 通过rsync备份静态文件
  8. 【数据分享】某产品付费用户数据
  9. linux centos Intel® Centrino® Wireless-N 1000 无线网卡的安装
  10. 深入浅出通信原理知识点10
  11. java给视频添加水印_javaCV视频添加水印
  12. Matlab绘图线条颜色,线型,标记点选项参数
  13. ffmpeg从视频文件中提取音频数据
  14. 转载的ctf练习链接
  15. 微信小程序获取客户端IP地址,HTTPS接口(ts\js)
  16. linux raid5 恢复,恢复磁盘阵列RAID 5损坏硬盘
  17. AI音乐作曲deepfake音乐的怪异世界
  18. SDWU 2021 Autumn Training Series C1 1st Round题解
  19. 小公司如何管理好团队?
  20. 百家讲坛 明太祖朱元璋

热门文章

  1. 《1+x》的错题集锦
  2. 就怕有的同事借到钱,转身就是一辈子 牢记三借三不借!
  3. 年薪不过27w全额退款丨BAT百万讲师打磨出完美匹配企业需求的大数据课程
  4. 维格云Word打印模版入门教程
  5. 超高速相机,在体育赛事中的应用发展
  6. 软件设计体系-简单工厂模式实例二---权限管理
  7. [数据结构]实现双向链表
  8. 分享一个随机更改 MAC地址 软件
  9. “保姆级”车载CAN总线教程(二)-堪称全网“最细”系列
  10. php长沙麻将手游源码,转转麻将长沙麻将源码全套可架设运营(C+编译)