接口、结构和装箱 这段代码是否符合我的想法?
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
的赋值如何工作?
我的看法:
- 在 Bar 构造函数中创建类型为
Foo()
的结构并设置其 Foobar = 0;
- 使用装箱 (?) 转换为
IFoo
的类型(因为 Biz
的类型为 IFoo
)
- 将引用类型
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
是邪恶的。
我正在阅读这个答案: 这是代码,为了完整性而复制并稍微简化了。
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
的赋值如何工作?
我的看法:
- 在 Bar 构造函数中创建类型为
Foo()
的结构并设置其 Foobar = 0; - 使用装箱 (?) 转换为
IFoo
的类型(因为Biz
的类型为IFoo
) - 将引用类型
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
是邪恶的。