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)多态:通过父类对象可以引用不同的子类,从而实现不 ...
随机推荐
- C++ const用法
C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的.如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助. 1.c ...
- Razor---服务器端标记语言
Razor 是一种允许您向网页中嵌入基于服务器的代码(Visual Basic 和 C#)的标记语法<ul> @for (int i = 0; i < 10; i++) { < ...
- Mac App开发
1. icns制作 在线工具: https://iconverticons.com/online/ 2. 替换dmg图标 选中dmg文件 右键, 选择显示简介 将icns图表拖拽到简介弹出框的左上角图 ...
- Win7 安装bundle
bundle依赖ruby,因此需要下载并安装一下内容: 1. rubyinstaller 这个是windows专用的ruby安装程序,下载地址是http://rubyinstaller.org/ 2. ...
- C# 深拷贝对象实现
public class DeepCopyHelper { //三种深拷贝方法 public static T DeepCopyByReflect<T>(T obj) { //如果是字符串 ...
- Codeforces 840C On the Bench dp
On the Bench 两个数如果所有质因子的奇偶性相同则是同一个数,问题就变成了给你n个数, 相同数字不能相邻的方案数. dp[ i ][ j ]表示前 i 种数字已经处理完, 还有 j 个位置需 ...
- 利用反射获取数据列+emit生成属性+单例模式
1:IDictionary<string,string > 可以存储数据,将拼接的sql可以存储到这里下次可以使用 定义自定义属性表和列 typeof(T).GetCustomAttrib ...
- Gym 100963B
Gym 100963B啊,郁闷,就tm调小了一点范围就A了,就写dp和贪心比较一下,范围到最大值的二倍-1就好了假设最大值的2倍以内能满足最优条件,当金额范围超过最大值2倍的时候:至于为什么,还不清楚 ...
- angularjs 设置全局变量(constant)
转:angularjs自身有二种,设置全局变量的方法,在加上js的设置全局变量的方法,总共有三种.要实现的功能是,在ng-app中定义的全局变量,在不同的ng-controller里都可以使用. 1, ...
- [PKUSC2018]星际穿越(倍增)
题意:n个点的图,点i和[l[i],i)的所有点连双向边.每次询问(l,r,x)表示x到[l,r]的所有点的最短路径长度和. 首先这题显然可以线段树优化建图,但是需要比较好的常数才能通过45分,还需要 ...