飞道的博客

C# 装箱和拆箱

361人阅读  评论(0)

看例子:


   
  1. long a = 1;
  2. object b = a;
  3. 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),

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

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

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


   
  1. int i=0;
  2. object obj=i;

这个过程就是装箱!

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


   
  1. int i=0;
  2. object obj=i;
  3. int j=(int)obj;

最后一句是将obj拆箱!

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

二、报错的原因


   
  1. long a = 1;
  2. object b = a;
  3. int c = (int)b;

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

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

int c = Convert.ToInt32(b);

int c = (int)(long)b;


转载:https://blog.csdn.net/qq_42672770/article/details/128675401
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场