如果您声明了一个结构:
struct EmptyResult
{
}
EmptyResult
在实例中创建类型变量的结果是什么?
public Foo()
{
EmptyResult result;
}
您会期望在堆栈上进行分配,还是实际上是空操作?
C# 编译器强制空结构的大小为 1 个字节。如果您查看反编译器中的结构,您可以看到这一点:
[StructLayout(LayoutKind.Sequential, Size=1)]
private struct EmptyResult
{
}
System.Byte
因此,该结构在类或堆栈中的任何实例都将占用 1 个字节,与or的实例完全相同System.SByte
没有字段的 AC# 结构的大小仍然为 1。原因是编译器必须能够&
在不安全代码中使用运算符获取结构的地址。
我希望您的结构类型与类型完全相同byte
。
I think it is a stack allocation, which is in line with how non-reference types work.
如果你idlasm.exe
用来研究 il,在你创建Empty
结构实例的那一行,你会看到:
.maxstack 1
.locals init ([0] valuetype Draft.Empty e)
Empty
struct的定义是:
.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
在发布模式下从编译的程序集中提取的定义。