博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
脚踏实地学C#3-装箱和拆箱
阅读量:4634 次
发布时间:2019-06-09

本文共 2536 字,大约阅读时间需要 8 分钟。

装箱:一种接受值类型的值,根据这个值在堆中创建一个完整的引用类型对象并返回对象的引用(堆地址)的隐式转换

int i_number = 2; //在栈中声明int类型i_Number变量并初始化object o_number = null; //在栈中声明object类型的o_Number变量并初始化值为null,不在堆中分配内存o_number = i_number;   //装箱过程 如下图所示①→②→③ Console.WriteLine(o_number);

装箱过程:1.在托管堆分配好内存,分配的内存量是值类型的字段需要的内存量(类型对象指针和同步索引块);

              2.值类型的字段复制到新分配的堆内存;

              3.将新分配的堆地址放入栈中的变量内;

拆箱:将装箱的对象转换为值类型的过程(显示转换)

object o_Number = 1; //装箱int i_Number = (int)o_Number; //拆箱Console.WriteLine(i_Number);

拆箱过程:1.获取已装箱的对象各个字段的地址;

              2.将字段包含的值复制到值类型的实例中;

装箱和拆箱测试

class Program     {        private static void Main(string[] args)        {            ValueTypeTestMethod();	    Console.ReadKey();        }        private static void ValueTypeTestMethod()        {            const int count = 10000000;  //循环的次数            using (new OperationTimer("List
Type(int)")) { List
list = new List
(); for (int i = 0; i < count; i++) { list.Add(i); //泛型不装箱 int x = list[i]; //不拆箱 } list = null; } using (new OperationTimer("ArrayList Type(int)")) { ArrayList arrayList = new ArrayList(); for (int i = 0; i < count; i++) { arrayList.Add(i); //会进行装箱 int x = (int)arrayList[i]; //进行拆箱 } arrayList = null; } } } internal sealed class OperationTimer : IDisposable { private long m_StartTime; private string m_MSG; private int m_CollectionCount; public OperationTimer(String msg) { PrepareForOperation(); //强制垃圾回收 m_MSG = msg; m_CollectionCount = GC.CollectionCount(0); m_StartTime = Stopwatch.GetTimestamp(); } public void Dispose() { Console.WriteLine("{0,6:###.00} seconds (GC={1,3}) {2}", (Stopwatch.GetTimestamp() - m_StartTime) / (double)Stopwatch.Frequency, GC.CollectionCount(0) - m_CollectionCount, m_MSG); } private static void PrepareForOperation() { GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); } }
集合 List<int> ArrayList
时间(s) 垃圾回收次数 时间(s) 垃圾回收次数
64位程序 .20 3 1.37 44
32位程序 .22 3 1.57 23

注意:从上面测试看出List<int>和ArrayList在所耗时间和垃圾回收区别都是在很大的,所以用泛型List<int>代替ArrayList是一个很好的习惯!同时也避免在循环中大量的装箱和拆箱操作;

转载于:https://www.cnblogs.com/qq0827/p/3317168.html

你可能感兴趣的文章
项目活动定义 概述
查看>>
团队冲刺04
查看>>
MAC和windows开发操作系统环境,解决Maven工程中报 Missing artifact jdk.tools:jdk.tools
查看>>
我的Python分析成长之路8
查看>>
Python从零开始 day2
查看>>
泛型在三层中的应用
查看>>
云栖社区> > 正文 永久免费SSL安全证书Letsencrypt安装使用方法
查看>>
SharePoint2010 -- 管理配置文件同步
查看>>
jq--ajax中止请求
查看>>
osgearth+vs2010安装
查看>>
linux内核内存管理(zone_dma zone_normal zone_highmem)
查看>>
第十一章_文件下载
查看>>
js自己定义插件-选项卡
查看>>
针对JavaScript的常用事件、对象捕获和使用技巧
查看>>
[NOI 2015]荷马史诗
查看>>
Struts2注解
查看>>
WCF入门(一)——简单的示例
查看>>
深入理解Java的接口和抽象类
查看>>
MYSQL 连接数据库命令收藏
查看>>
struts2登录后返回登录前的页面
查看>>