C#基础加强(5)之装箱与拆箱
定义
- 装箱:将值类型赋值给 Object 类型变量时,就是装箱操作,即包装为 Object 对象。
因为值类型都是 ValueType 类型,而 ValueType 页继承了 Object(CLR 内部处理),所以值类型可以转为 Object类型。
- 拆箱:将 Object 类型变量赋值给值类型的时候就是拆箱操作,需要做显示转换。
示例
看如下示例:
internal class Program
{
public static void Main(string[] args)
{
;
object numObj = i; // 装箱
int j = (int) numObj; // 拆箱
Console.WriteLine(j);
}
}
我们查看它生成的 IL 语言:
.method public hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack
.locals init (
[] int32 num,
[] object obj2,
[] int32 num2)
L_0000: nop
L_0001: ldc.i4.s
L_0003: stloc.
L_0004: ldloc.
L_0005: box int32
L_000a: stloc.
L_000b: ldloc.
L_000c: unbox.any int32
L_0011: stloc.
L_0012: ldloc.
L_0013: call void [mscorlib]System.Console::WriteLine(int32)
L_0018: nop
L_0019: ret
}
对比看其实很直观,在第 13 行通过 box int32 给我们编写的 装箱为 object 对象,而在 16 行通过 unbox.any int32 将 object 类型的对象拆箱为 int 类型。
相关面试题
1、下面三句代码有没有错?
; object obj = i; int j = obj;
答案:很明显上面代码使用错误的,因为拆箱(将 Object 类型的变量赋值给值类型)需要做显示转换,而第 3 行并没有。
2、下面代码会不会报错?为什么报错?
; object obj = i; int j1 = (int) obj; long j2 = i; long j3 = (long) i; long j4 = (long) obj;
答案:先直接调试看结论:

显然,报错在第 6 行,原因是装箱到 obj 对象的变量 i 为 int 类型,而拆箱时使用的是 long 类型,虽然 int 类型可以隐式转换为 long 类型,但做拆箱时,只能以装箱时的类型进行拆箱。
C#基础加强(5)之装箱与拆箱的更多相关文章
- C#基础知识系列二(值类型和引用类型、可空类型、堆和栈、装箱和拆箱)
前言 之前对几个没什么理解,只是简单的用过可空类型,也是知道怎么用,至于为什么,还真不太清楚,通过整理本文章学到了很多知识,也许对于以后的各种代码优化都有好处. 本文的重点就是:值类型直接存储其值,引 ...
- c#基础语言编程-装箱和拆箱
引言 为什么有装箱和拆箱,两者起到什么作用?NET的所有类型都是由基类System.Object继承过来的,包括最常用的基础类型:int, byte, short,bool等等,就是说所有的事物都是对 ...
- 基础系列(4)—— C#装箱和拆箱
一 装箱和拆箱的概念 装箱是将值类型转换为引用类型 : 拆箱是将引用类型转换为值类型 : 值类型:包括原类型(Sbyte.Byte.Short.Ushort.Int.Uint.Long.Ulong.C ...
- 【.Net基础二】浅谈引用类型、值类型和装箱、拆箱
目前在看CLR via C#,把总结的记下来,索性就把他写成一个系列吧. 1.[.Net基础一] 类型.对象.线程栈.托管堆运行时的相互关系 2.[.Net基础二]浅谈引用类型.值类型和装箱.拆箱 引 ...
- Java 基础 - 装箱, 拆箱
总结 1-装箱过程是通过调用包装器的valueOf方法实现的,而拆箱过程是通过调用包装器的 xxxValue方法实现的.(xxx代表对应的基本数据类型).例如:在装箱的时候自动调用的是Integer的 ...
- C#基础回顾(二)—页面值传递、重载与重写、类与结构体、装箱与拆箱
一.前言 -孤独的路上有梦想作伴,乘风破浪- 二.页面值传递 (1)C#各页面之间可以进行数据的交换和传递,页面之间可根据获取的数据,进行各自的操作(跳转.计算等操作).为了实现多种方式的数据传递,C ...
- Java基础(35):装箱与拆箱---Java 中基本类型和包装类之间的转换(Wrapper类)
基本类型和包装类之间经常需要互相转换,以 Integer 为例(其他几个包装类的操作雷同哦): 在 JDK1.5 引入自动装箱和拆箱的机制后,包装类和基本类型之间的转换就更加轻松便利了. 那什么是装箱 ...
- Java基础 【自动装箱和拆箱、面试题】
JDK 1.5 (以后的版本)的新特性自动装箱和拆箱 1. 自动装箱:把基本类型转换为包装类类型 int a =10; Integer i = new Integer(a); Integer valu ...
- JAVA基础之——三大特征、接口和抽象类区别、重载和重写区别、==和equals区别、JAVA自动装箱和拆箱
1 java三大特征 1)封装:即class,把一类实体定义成类,该类有变量和方法. 2)继承:从已有的父类中派生出子类,子类实现父类的抽象方法. 3)多态:通过父类对象可以引用不同的子类,从而实现不 ...
随机推荐
- Javascript—DOM
1.什么是DOM? DOM 是 W3C(万维网联盟)的标准.DOM 定义了访问 HTML 和 XML 文档的标准: "W3C 文档对象模型(DOM)是中立于平台和语言的接口,它允许程序和脚本 ...
- 获取元素属性get_attribute
获取text # coding:utf-8 from appium import webdriver from time import sleep desired_caps = { 'platform ...
- 爬虫-requests
一.爬虫系列之第1章-requests模块 爬虫简介 概述 近年来,随着网络应用的逐渐扩展和深入,如何高效的获取网上数据成为了无数公司和个人的追求,在大数据时代,谁掌握了更多的数据,谁就可以获得更高的 ...
- ssh项目问题01,为创建数据库抛出的异常
框架什么都搭建好了,但是一直抛出如图问题,网上资料很多让你设置时间之类的,也设置了还是继续抛异常,最后带我的师傅说没有创建数据库,我都要郁闷死了,网上那么多,很多写的都不能解决问题,还乱写,浪费别人时 ...
- 编码 ASCII, GBK, Unicode+utf-8
0. 1.参考 网页编码就是那点事 阮一峰 字符编码笔记:ASCII,Unicode 和 UTF-8 2.总结 美国 ASCII 码 发音: /ˈæski/ :128个字符,只占用了一个字节的后面7位 ...
- SQL反模式学习笔记21 SQL注入
目标:编写SQL动态查询,防止SQL注入 通常所说的“SQL动态查询”是指将程序中的变量和基本SQL语句拼接成一个完整的查询语句. 反模式:将未经验证的输入作为代码执行 当向SQL查询的字符串中插入别 ...
- PBRT笔记(1)——主循环、浮点误差
PBRT2与3之间的改动 增加了一个功能完备的BRDF模型,支持体积光照与重要性多重路径采样. 次表面散射,基于光线追踪技术,无需预处理. 解决浮点数四折五入的问题 光子映射 样本生成 第一章多了讲并 ...
- Android项目中的config.xml文件 “config.xml”
Android应用程序需要保存一些配置时,可以将这些配置项放置到values/config.xml文件中. 实例分析: <?xml version="1.0" encodin ...
- 红帽 Red Hat Linux相关产品iso镜像下载【百度云】【更新7.2】
RedHat Enterprise Server 6.7 for i386 Boot Disk:rhel-server-6.7-i386-boot.iso SHA-256 Checksum: 798d ...
- Tornado-Form表单验证
基本思路 用户提交表单后,验证开始.页面中会有多个域要求验证,如text input,files, checkbox.同时,根据验证字段的不同,验证方式会有很多种,例如对邮箱.IP地址.电话的验证标准 ...