接口、结构和装箱 这段代码是否符合我的想法?

Interfaces, structs and boxing is this code doing what I think?

我正在阅读这个答案: 这是代码,为了完整性而复制并稍微简化了。

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 拆箱为值类型结构 (Foo) 并分配给 tmp。

那么这个描述是否正确?这真的是 un/boxing 即使我们不使用对象 class?

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

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

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

可变 struct 是邪恶的。