如果您已声明结构:
struct EmptyResult
{
}
在实例中创建类型为EmptyResult
的变量的结果是什么?
public Foo()
{
EmptyResult result;
}
您是否期望在堆栈上进行分配,还是实际上是无操作?
答案 0 :(得分:9)
C#编译器强制空结构的大小为1个字节。如果你看一下反编译器中的结构,你可以看到这个:
[StructLayout(LayoutKind.Sequential, Size=1)]
private struct EmptyResult
{
}
因此,类或堆栈中该结构的任何实例都将占用1个字节,与System.Byte
或System.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
的定义。