C# 装箱与拆箱

深入理解C#的装箱和拆箱
再谈C#装箱和拆箱

装箱和拆箱是值类型和引用类型之间相互转换是要执行的操作。

装箱就是将一个值类型转换成等价的引用类型.
它分别以下几个步骤:

  • 在堆上为新生成的对象实例分配内存。该对象实例包含数据,但它没有名称。
  • 上值类型变量的值复制到 堆上的对象
  • 将堆上创建的对象的地址返回给引用类型变量
    在这里插入图片描述

拆箱则是将一个已装箱的引用类型转换为值类型
它分为以下两步:

  • 获取已装箱的对象的地址。
  • 将值从堆上的对象中复制到堆栈上的值变量中。

可见,装箱和拆箱需要反复在堆上进行操作,因此,在程序中应该尽量避免无意义的装
箱和拆箱。

    class Box
    {
        public static void PackingAndUnPacking()
        {
        	// 装箱
            int i = 1;
            Object boxed = i;
            Console.WriteLine("Packing: " + boxed);

			// 拆箱
            int j = (int)boxed;

            Console.WriteLine("UnPacking: " + j);
        }

    }

装箱操作和拆箱操作是要额外耗费cpu和内存资源的,在c# 2.0之后引入了泛型来减少装箱操作和拆箱操作消耗

1 使用非泛型集合时引发的装箱和拆箱操作

var array = new ArrayList();
array.Add(1);
array.Add(2);
 
foreach (int value in array)
{
	Console.WriteLine(“value is {0}”,value);
}

没有使用泛型. 会发生两次装箱操作和两次拆箱操作.
当往list中添加数字类型时,会将int类型元素装箱成为Object.
在foreach过程中.Object拆箱为int类型.

var list = new List<int>();
list.Add(1);
list.Add(2);
 
foreach (int value in list)
{
	Console.WriteLine("value is {0}", value);
}

差别在于集合的类型使用了泛型的List,而非ArrayList;
上述代码只会在Console.WriteLine()方法时执行2次装箱操作,不需要拆箱操作。
泛型可以避免装箱拆箱带来的不必要的性能消耗;当然泛型的好处不止于此,泛型还可以增加程序的可读性,使程序更容易被复用等等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值