在C#中新建一个空结构有什么作用?

时间:2013-06-06 15:22:06

标签: c# struct clr

如果您已声明结构:

struct EmptyResult
{
}

在实例中创建类型为EmptyResult的变量的结果是什么?

public Foo()
{
    EmptyResult result;
}

您是否期望在堆栈上进行分配,还是实际上是无操作?

4 个答案:

答案 0 :(得分:9)

C#编译器强制空结构的大小为1个字节。如果你看一下反编译器中的结构,你可以看到这个:

[StructLayout(LayoutKind.Sequential, Size=1)]
private struct EmptyResult
{
}

因此,类或堆栈中该结构的任何实例都将占用1个字节,与System.ByteSystem.SByte的实例完全相同

答案 1 :(得分:3)

没有字段的AC#struct的大小仍为1.原因是编译器必须能够在不安全的代码中使用&运算符获取结构的地址。

我希望您的结构类型的处理方式与byte类型完全相同。

答案 2 :(得分:1)

我认为这是一个堆栈分配,与非引用类型的工作方式一致。

答案 3 :(得分:1)

如果您使用idlasm.exe来研究il,则在您创建Empty结构实例的行中,您会看到:

.maxstack  1
.locals init ([0] valuetype Draft.Empty e)

Empty结构的定义是:

.class private sequential ansi sealed beforefieldinit Draft.Empty
       extends [mscorlib]System.ValueType
{
  .pack 0
  .size 1
} // end of class Draft.Empty

如您所见,它在创建时分配1个字节,在定义中,此类型的大小为1.

是的;它在堆栈上分配1个字节。

注意:在发布模式下从已编译的程序集中提取的Empty的定义。