如果你已经声明了一个结构:
struct EmptyResult
{
}
创建类型变量的结果是什么 EmptyResult
在一个实例?
public Foo()
{
EmptyResult result;
}
您是否期望在堆栈上进行分配,还是实际上是无操作?
如果你已经声明了一个结构:
struct EmptyResult
{
}
创建类型变量的结果是什么 EmptyResult
在一个实例?
public Foo()
{
EmptyResult result;
}
您是否期望在堆栈上进行分配,还是实际上是无操作?
C#编译器强制空结构的大小为1个字节。如果你看一下反编译器中的struct,你可以看到这个:
[StructLayout(LayoutKind.Sequential, Size=1)]
private struct EmptyResult
{
}
因此,类或堆栈中该结构的任何实例都将占用1个字节,与实例完全相同 System.Byte
要么 System.SByte
没有字段的C#结构的大小仍然是1.原因是编译器必须能够使用以下内容获取结构的地址 &
运算符在不安全的代码中。
我希望你的结构类型的处理方式与 byte
类型。
我认为这是一个堆栈分配,它与非引用类型的工作方式一致。
如果你使用 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
在发布模式下从已编译的程序集中提取。