目录

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. MySQL 5.5 服务器变量详解(二)
  2. [HDOJ1301]Jungle Roads
  3. 史上最易懂的 Kubernetes 儿童插图指南
  4. ASM_PREFERRED_READ_FAILURE_GROUPS
  5. no acceptable C compiler found in $PATH
  6. 最值反演[PKUWC2018][loj2542]随机游走
  7. STL源码剖析 list概述
  8. 千万商家的智能决策引擎--AnalyticDB如何助力生意参谋双十一
  9. Spring Boot 案例:连接后台数据库实现用户登录
  10. AttributeError: type object 'h5py.h5.H5PYConfig' has no attribute '__reduce_
  11. 项目铺垫系列导航目录
  12. web安全day27:linux下调整文件及目录权限
  13. python orm开发模型_Python ORM框架Peewee初探【二】创建或者生成模型
  14. COMSOL电磁仿真案例——感应线圈
  15. mac外接显示器 竖屏 黑苹果_解决黑苹果HD3000核显 VGA和HDMI外接显示器无反应问题...
  16. Delphi XE8 TStyleBook的使用
  17. 第二章笔记:计数初步
  18. 【Python数据科学 | 11】应用实战:我的第一个开源项目-基金定投回测工具
  19. tcc275CAN报文发送多帧只发送一帧的原因
  20. 字体大宝库:25款很好看的手写字体下载

热门文章

  1. Java File类之getPath | getAbsolutePath | getCanonicalPath
  2. cc2530期末试卷_ZigBee期末试题
  3. 盒子的阴影:阴影的css格式
  4. Freemarker新手教程详细
  5. CF1214D Treasure Island
  6. 复旦微的 JFM7K325T 国产化设计资料(PCIE711)
  7. 华为机试HJ22:汽水瓶
  8. 广汽研究院BMS软件工程师_应届硕士去广汽研究院的待遇?
  9. mysql的rand()随机数函数
  10. qpython 3h怎么使用_使用瞬间胶水的方法及注意事项