装箱拆箱

我原来对于装拆箱的理解只是停留在将值类型转化为Object类型,然后再转换回来。实际上,在这个看似简单的问题上还有一层更深的含义。
值类型和引用类型在实例化的时候是存储在不同的空间中的,值类型存储在Stack上,而引用类型是存储在Heap上,在装箱的过程中实际上是将在Stack上的值类型对象拷贝到Heap上,并以引用对象的存储格式保存,在这个过程中对所转换的引用类型对象进行修改操作,Stack上的值类型对象是不会变化的。而拆箱是将引用对象的值在拷贝回Stack上。
下面我们来看一个例子:
首先需要一个值类型,让它继承自一个接口
public interface IAdjustor
    {
        void Adjust();
    }
 
    public struct Size : IAdjustor
    {
        public int height;
        public int weight;
        public void Adjust()
        {
            height += 2;
            weight += 3;
        }
 }
然后,再用 ClientApp测试一下:
class Program
    {
        static void Main(string[] args)
        {
            Size s = new Size();
            s.Adjust();
            Console.WriteLine("height:" + s.height + " weight:" + s.weight);
            IAdjustor itf = s; //In box
            itf.Adjust();
            Console.WriteLine("height:" + s.height + " weight:" + s.weight);
            s = (Size)itf;      //Un box
            Console.WriteLine("height:" + s.height + " weight:" + s.weight);
            Console.Read();
        }
 }
    输出结果如下:
height:2 weight:3
height:2 weight:3
height:4 weight:6
从结果不难看出,在装箱后 IAdjustor itf = s,调用已为引用对象的 Adjust()方法,相应的值类型对象并没有发生变化。在拆箱后s = (Size)itf;,值类型对象就变化了
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值