C# 装箱和拆箱

看例子:

long a = 1;
object b = a;
int c = (int)b;

以上代码将b转换成int型时将会发生异常报错,System.InvalidCastException: Specified cast is not valid.

让我们分析下为什么会报错?首先说说装箱和拆箱的概念。

一、什么是装箱和拆箱?

装箱 和拆箱 是C#类型系统的核心概念,通过装箱和拆箱操作,可以轻松的实现值类型与引用类型的互相转换

C#语言中的所有类型都是由基类System.Object继承过来的,包括最常用的基础类型:int, byte, short,bool等等,就是说所有的事物都是对象。如果申明这些类型的时候都在堆(HEAP)中分配内存,会造成极低的效率

.NET如何解决这个问题呢?正是通过将类型分成 值类型 和引用类型

值类型包括(Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal)、枚举(enum)、结构(struct),

引用类型包括:类、数组、接口、委托、字符串等。

值型就是在栈中分配内存,引用型是在堆中分配内存

装箱就是隐式的将一个值型转换为引用型对象。比如:

int i=0;
object obj=i;

这个过程就是装箱!

拆箱就是将一个引用型对象转换成任意值型!比如:

int i=0;
object obj=i;
int j=(int)obj;

最后一句是将obj拆箱!

那我们知道了装箱和拆箱是怎么回事,分析下为什么会报错呢?

二、报错的原因

 long a = 1; 
 object b = a;
 int c = (int)b;

编译器知道b是object类型的对象,但拆箱的时候只能转换成long型,与int型不匹配所以报了错。

如果想转可以采用下面两种方式

int c = Convert.ToInt32(b);

int c = (int)(long)b;

你可能感兴趣的:(C#,数据结构与算法,c#)