抽象类与结构,装箱拆箱

16 篇文章 0 订阅
 
    class Test
    {
        interface IAddOne
        {
            int AddOne();
        }
        struct FixPoint : IAddOne
        {
            int _x;
            public FixPoint(int x)
            {
                _x = x;
            }
            public int AddOne()
            {
                ++_x;
                return _x;
            }
        }
        static void Main()
        {
            ArrayList pointList = new ArrayList(1);
            FixPoint f = new FixPoint(0);
            pointList.Add(f);

            Console.Write(f.AddOne());
            Console.Write(f.AddOne());
            Console.Write(f.AddOne());

            Console.WriteLine();
            Console.WriteLine(pointList[0]);

            Console.Write(((IAddOne)pointList[0]).AddOne());//值类型,保存在栈上 
          //  Console.Write(((IAddOne)pointList[0]).AddOne());  //12345
            //FixPoint p = (FixPoint)pointList[0];//引用类型,保存在受管制的堆上
            //Console.Write(p.AddOne());


            FixPoint p = (FixPoint)pointList[0];
            Object obj = pointList[0];
            Console.Write(p.AddOne());
            Console.Write(p.AddOne());
            Console.WriteLine(p.AddOne());
            Console.WriteLine("next");

            Console.Write(((IAddOne)pointList[0]).AddOne());
            Console.Write(((IAddOne)pointList[0]).AddOne());
            Console.Write(((FixPoint)pointList[0]).AddOne());
            Console.Write(((FixPoint)pointList[0]).AddOne());
            Console.Write(((FixPoint)pointList[0]).AddOne());
            Console.Write(((FixPoint)pointList[0]).AddOne());
            Console.Read();      }
      }

123
ConsoleApplication1.Test+FixPoint
1234
next
2
2345555

 

详细介绍:http://topic.csdn.net/u/20111118/22/e119cef9-a5e7-4d8c-8bc8-bf747370e954.html

ArrayList pointList = new ArrayList(1);
  FixPoint f = new FixPoint(0); // 此处引起装箱, f 和 pointList[0] 虽数据相同,却已经不是同一个对象了。
// f 指向的是 栈 中的对象,而 pointList[0] 却指向的是 堆中 被装箱的对象。
  pointList.Add(f);
   
  Console.Write(f.AddOne());
  Console.Write(f.AddOne());
  Console.Write(f.AddOne());
   
  Console.WriteLine();
  Console.WriteLine(pointList[0]); // 输出结果为FixPoint
Console.WriteLine(((FixPoint)pointList[0])._x); //输出为 0 

  Console.WriteLine(((IAddOne)pointList[0]).AddOne());//输出为 1 强制转换为 接口 ,不会导致拆箱
Console.WriteLine(((FixPoint)pointList[0]).AddOne());//输出为 2 强制转换为 stuuct ,会导致拆箱 ,修改的是复制到 栈 中的对象

  FixPoint p = (FixPoint)pointList[0]; //拆箱发生复制 p和pointlist[0]没有关系了
  Console.WriteLine(p.AddOne()); //输出为 2

Console.WriteLine(((FixPoint)pointList[0])._x); //输出为 1 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值