11

如果您声明了一个结构:

struct EmptyResult
{
}

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

public Foo()
{
    EmptyResult result;
}

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

4

4 回答 4

9

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

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

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

于 2013-06-06T15:27:42.333 回答
3

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

我希望您的结构类型与类型完全相同byte

于 2013-06-06T15:46:37.110 回答
1

I think it is a stack allocation, which is in line with how non-reference types work.

于 2013-06-06T15:24:16.800 回答
1

如果你idlasm.exe用来研究 il,在你创建Empty结构实例的那一行,你会看到:

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

Emptystruct的定义是:

.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在发布模式下从编译的程序集中提取的定义。

于 2013-06-06T15:48:39.683 回答