拆箱存在的隐患

static void Main(string[] args)

{

Int32 i = 10;
object obj = new object();
//装箱操作,通常没有异常
try
{
obj = i;
Console.WriteLine("装箱成功!");
}
catch (Exception ex)
{
Console.WriteLine("装箱失败:"+ex.Message);

return;
}
//拆箱操作,易产生隐患
try
{
Int64 j = (Int64)obj;
Console.WriteLine("拆箱成功!");
}
catch (Exception ex)
{
Console.WriteLine("拆箱失败:"+ex.ToString());
}
Console.Read();

}

分析:程序会抛出InvalidCastException类型的异常,这个异常的含义是无效类型转换或是显式转换引发异常。这说明该异常是因被拆箱对象的最初类型与拆箱时的值类型不一致而产生的。同时也论证了拆箱时的一条原则:被拆箱对象的最初类型与拆箱时的值类型必须一致!

解决:

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

技巧:装箱和拆箱操作会影响系统性能。并且拆箱操作容易产生隐患,所以建议在可以确定值类型的情况下,应该尽可能的使用泛型技术来处理,这样可以避免大量地使用拆箱和装箱操作。

时间: 2024-10-09 05:20:29

拆箱存在的隐患的相关文章

深入剖析Java中的装箱和拆箱

阅读目录 一.什么是装箱?什么是拆箱?二.装箱和拆箱是如何实现的三.面试中相关的问题 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱.拆箱相关的问题. 回到顶部 一.什么是装箱?什么是拆箱? 我们知道 Java为每种基本数据类型都提供了对应的包装器类型,至于为什么会为每种基本数据类型提供包装器类型在此不进行阐述,有兴趣的朋友可以查阅相关资料.在Java SE5之前,如果要生成

自动装箱/自动拆箱/注释之反编译示例

下面是源码: 1 package test; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public class Test { 7 public static void main(String[] args) { 8 List<Integer> list = new ArrayList<>(); 9 //下面会触发编译器自动装箱 10 list.add(1); 11 //下面会触发编译器自动拆箱 12

装箱与拆箱

一.装箱机制: 1,在托管堆中分配内存.分配的内存量是值类型各字段所需的内存量,还要加上托管堆中所有对象都有的两个额外成员(类型对象指针和同步块索引)所需的内存量2,值类型字段复制到新分配的堆内存3,返回对象地址.现在该地址是对象的引用:值类型成了引用类型 二.拆箱机制 1,获取已装箱值类型对象中的各个字段的地址(这个过程是装箱)2,将字段包含的值从堆复制到基于栈的值类型字段实例中3,如果包含"对已装箱值类型实例的引用"的变量为null,抛出NullReferenceException

Java自动装箱拆箱

一.装箱.拆箱定义 如果一个int型量被传递到需要一个Integer对象的地方,那么,编译器将在幕后插入一个对Integer构造方法的调用,这就叫做自动装箱.而如果一个Integer对象被放到需要int型量的地方,则编译器将幕后插入一个队intValue方法的调用,这就叫做自动拆箱. public static void main(String[] args) { // 装箱 Integer i1 = Integer.valueOf(1); // 自动装箱 Integer i2 = 1;// 默

转 C# 装箱和拆箱[整理]

1.      装箱和拆箱是一个抽象的概念 2.      装箱是将值类型转换为引用类型 :拆箱是将引用类型转换为值类型       利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类型链接起来 例如: int val = 100; object obj = val; Console.WriteLine (“对象的值 = {0}", obj); 这是一个装箱的过程,是将值类型转换为引用类型的过程 int val = 100; object obj =

NET中的类型和装箱/拆箱原理

谈到装箱拆箱,DebugLZQ相信给位园子里的博友一定可以娓娓道来,大概的意思就是值类型和引用类型的相互转换呗---值类型到引用类型叫装箱,反之则叫拆箱.这当然没有问题,可是你只知道这么多,那么DebugLZQ建议你花点时间看看楼主这篇文章,继续前几篇博文的风格--浅谈杂侃. 1. .NET中的类型 为了说明装箱和拆箱,那首先必须先说类型.在.NET中,我们知道System.Object类型是所有内建类型的基类.注意这里说的是内建类型,程序员可以编写不继承子自System.Object的类型,这

【c#】装箱与拆箱

从内存执行的角度来看,值类型的内存分配在线程的堆栈上,而引用类型的内存分配在托管堆上.因此从值类型向引用类型的转换,势必牵涉到数据的拷贝与指针引用等操作. 装箱操作,大致过程为:在托管堆中分配新对象的内存,将值类型的字段拷贝到该内存中,然后返回该对象的地址,这样就完成了从值类型到引用类型的转变:拆箱操作,则是获取已装箱对象中来自值类型部分字段的地址.装箱与拆箱并非完全对称的互逆操作,拆箱并不包含字段的拷贝. 概念雷区: 装箱与拆箱不是完全对等的互逆操作.从内存的角度上看,拆箱的性能开销远小于装箱

封箱和拆箱

封箱的含义:把值类型转换为System.Object类型,或者转换为由值类型实现的结构类型. 如:struct MyStruct { pubilc int Val; } MyStruct valType1 = new MyStruct(); valType1.Val = 5; object refType = valType1; //把值类型的结构放入object类型的变量中,以封箱它. 拆箱的含义:是和封箱做相反的操作. 如:valType.Val = 6; //对原值类型进行赋值 MyStr

EffectiveC#17--装箱和拆箱的最小化

1.如下这段代码会经历装箱和拆箱.例如25会先装箱成object后传递给writeline方法(一次拷贝),在方法内部又 经历拆箱成int(第二次拷贝)后然后调用tostring(). Console.WriteLine("A few numbers:{0}, {1}, {2}", 25, 32, 50); 所以建议这种写法:只经历一次装箱 Console.WriteLine("A few numbers:{0}, {1}, {2}", 25.ToString(),