C#中装箱和拆箱的区别
内容
在C#中,所有值类型都从类对象派生。因此,对象类型的引用变量可以引用任何其他值类型。 C#为装箱和拆箱引入了两种方法,它们将值类型链接到引用类型。装箱和拆箱之间的基本区别在于,装箱是将值类型转换为对象类型,而另一方面,术语“装箱”是指将对象类型转换为值类型。让我们研究装箱和拆箱之间的其他区别。
- 比较表
- 定义
- 关键差异
- 结论
比较表
比较基础 | 拳击 | 拆箱 |
---|---|---|
基本的 | 对象类型是指值类型。 | 从装箱的对象中检索值的过程。 |
存储 | 存储在堆栈中的值将复制到存储在堆内存中的对象。 | 存储在堆内存中的对象值将复制到存储在堆栈中的值类型。 |
转换次数 | 隐式转换。 | 显式转换。 |
例 | 整数n = 24; 对象ob = n; | int m =(int)ob; |
拳击的定义
装箱是将值类型转换为对象类型的过程。此处,值类型存储在堆栈上,而对象类型存储在堆内存中。值类型到对象类型的这种转换是隐式转换。您可以直接为对象分配一个值,C#将处理其余的转换。让我们用一个例子来了解拳击。
我= 24;对象ob = i; //将整数类型n装箱到对象类型ob中。或对象ob1 = 21; //这里对象类型ob1也是整数类型
在上面的代码中,包含值24的整数类型i存储在堆栈上,并被复制到对象类型ob。对象类型现在引用一个整数值。现在,“ int i”也包含值24,“ object type ob”也包含值24,但是这两个值彼此独立,即,如果更改i的值,则不会反映i的更改。值
装箱会消耗额外的内存以及更多的时间。原因是将引用值类型的新对象必须在堆上分配内存空间。接下来,存储在堆栈上的值类型的值将被转移到堆存储器位置上的对象类型。
拆箱的定义
与装箱相反的是取消装箱。拆箱是对象类型到值类型的转换。在“拆箱”中,将存储在堆中的装箱的对象类型的值转移到存储在堆栈中的值类型。与装箱不同,拆箱必须明确进行。对象类型显式转换为值类型,并且值类型必须与对象类型所引用的值相同。让我们通过示例来了解取消装箱的概念。
我= 24;对象ob = i; //将整数类型n装箱到对象类型ob中。 int j =(int)ob; //将存储在对象类型ob中的整数值拆箱为整数类型y。
通过将对象ob中的值强制转换为与对象所引用的类型相同的类型(即整数类型“ j”)来检索该值。
取消装箱也会消耗更多的内存和更多的时间。因为,当必须取消装箱对象类型时,必须将存储在堆中的对象类型的值转移到存储在堆栈中的新值类型。现在可以将已检索其值的对象类型用于垃圾回收。
- 在装箱中,将对象称为值类型。另一方面,从装箱的对象取回值的过程称为拆箱。
- 存储在堆栈中的值类型将复制到存储在堆内存中的对象。另一方面,在拆箱中,将存储在堆内存中的对象复制到存储在堆栈存储器中的值类型。
- 装箱是隐式转换,而装箱是显式转换。
结论:
装箱和拆箱都消耗更多的时间和内存,并且计算量大。它们还缺乏类型安全性,并增加了运行时开销。始终建议避免在程序中过多使用装箱和拆箱。