网站开发快递文件,南山出名的互联网公司,wordpress 块状,wordpress主题太难看了上一篇文章讲了C#的值类型和引用类型#xff0c;这里再来看看值类型和引用类型最直接的使用场景#xff1a;装箱和拆箱。
一、基本概念 装箱#xff1a;值类型转化为引用类型的过程。从托管堆中为新生成的引用类型对象分配内存,再把值类型的实例字段拷贝到托管堆上新对象的…上一篇文章讲了C#的值类型和引用类型这里再来看看值类型和引用类型最直接的使用场景装箱和拆箱。
一、基本概念 装箱值类型转化为引用类型的过程。从托管堆中为新生成的引用类型对象分配内存,再把值类型的实例字段拷贝到托管堆上新对象的内存中然后返回对象的引用。 拆箱引用类型转化为值类型的过程。获取指向对象中包含的值类型部分[数据字段]的指针不会涉及字段拷贝。 利用装箱和拆箱功能可通过允许值类型的任何值与Object 类型的值相互转换将值类型与引用类型链接起来。
二、装箱/拆箱的内部操作
1、装箱
对值类型在堆中分配一个对象实例并将该值复制到新的对象中。按三步进行。
1新分配托管堆内存(大小为值类型实例大小加上一个方法表指针和一个SyncBlockIndex
2将值类型的实例字段拷贝到新分配的内存中
3返回托管堆中新分配对象的地址。这个地址就是一个指向对象的引用 2、拆箱
拆箱过程分两步进行
1检查对象实例确保它是给定值类型的一个装箱值
2将该值从实例复制到值类型变量中 通过上述的原理可以看出装拆箱分配内存和拷贝数据会影响性能的操作尽量避免装拆箱。
三、装箱拆箱实例分析
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Security;
using System.Text;namespace ConsoleApplication1
{class Program{static void Main(string[] args){Dowork();}static void Dowork(){int i 10;//将值类型的i装箱//需要注意的是:这里的装箱采用的是值的拷贝object obj i;//检验是否装箱成功了if (obj is int){Console.WriteLine(数据已经装箱!);}//我们在这里更改i的值i 33;Console.WriteLine(int i现在的值是:{0}, i);Console.WriteLine(int i装箱的值是:{0}, obj);//拆箱操作int j (int)obj;Console.WriteLine(j的值为{0}, j.ToString());}}
}
小结
从程序员的角度来看装箱和拆箱是很方便的我们不需要手动去复制和转移内存中的值类型和引用类型的数据。
但装箱和拆箱背后的栈/堆内存转移也带来了性能问题。所以我们平时在编程时应当尽量避免发生装箱和拆箱操作。