接口,结构和装箱是这个代码做我想的吗?

时间:2015-11-05 17:48:50

标签: c# struct interface boxing

我正在阅读这个答案:https://stackoverflow.com/a/15209464/1073672 这是代码,为了完整而复制并略微简化。

using System;

namespace Test
{
    interface IFoo
    {
        int Foobar{get;set;}
    }
    struct Foo : IFoo 
    {
        public int Foobar{ get; set; }
    }

    class Bar
    {
        // These two lines. I can not understand how they will work.
        Foo tmp;
        public IFoo Biz{ get { return tmp; } set { tmp = (Foo) value; } }

        public Bar()
        {
            Biz = new Foo(){Foobar=0};
        }
    }


    class MainClass
    {
        // This is not really important.
        public static void Main (string[] args)
        {
            var mybar = new Bar();
        }
    }
}

如何构建Bar并分配给Biz? 我的看法:

  1. 在Bar构造函数中创建一个类型为Foo()的结构并设置其Foobar = 0;
  2. 使用装箱(?)投放到IFoo类型(因为Biz类型为IFoo
  3. 将引用类型IFoo取消设置为值类型struct (Foo)并分配给tmp。
  4. 这个描述是否正确?即使我们不使用对象类,这实际上是un / boxing吗?

1 个答案:

答案 0 :(得分:1)

您的描述是正确的。将struct转换为接口会导致装箱。

一个有趣的副作用是分配给Bar.Biz.Foobar不会导致任何变化:

var mybar = new Bar();
mybar.Biz.Foobar = 2;
int fooBar = mybar.Biz.Foobar; // still 0

可变struct是邪恶的。