在C#中,新建空结构做什么?

在C#中,新建空结构做什么?,c#,struct,clr,C#,Struct,Clr,如果已声明结构,请执行以下操作: struct EmptyResult { } 在实例中创建类型为EmptyResult的变量的结果是什么 public Foo() { EmptyResult result; } 您希望在堆栈上进行分配,还是实际上是一种不操作?我认为这是一种堆栈分配,与非引用类型的工作方式一致。C编译器强制空结构的大小为1字节。如果查看反编译器中的结构,可以看到这一点: [StructLayout(LayoutKind.Sequential, Size=1)] pr

如果已声明结构,请执行以下操作:

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

public Foo()
{
    EmptyResult result;
}

您希望在堆栈上进行分配,还是实际上是一种不操作?

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

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

[StructLayout(LayoutKind.Sequential, Size=1)]
private struct EmptyResult
{
}
因此,类或堆栈中该结构的任何实例都将占用1个字节,与
System.byte
System.SByte
没有字段的C#结构的实例大小仍然为1完全相同。这样做的原因是编译器必须能够在不安全代码中使用
&
运算符获取结构的地址


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

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

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

我希望编译器对此进行优化。在Foo中的那一行上放一个断点,看看它是否命中?如果将变量的类型设置为
int
,它将被优化掉。也许更好的例子是将结构传递给函数。这让我想知道,存储的值和引用类型的类型在哪里,但这是另一个问题;你如何分配0字节?在C++中,它占用一个字节。大概它是这样做的,以便能够获取它的地址。你不需要反编译。您可以使用
Marshal.SizeOf(typeof(EmptyResult))
。我正要发布,但速度太慢了。@DavidHeffernan我相信你是对的-这样你就可以获取它的地址,但也可以让两个实例有不同的地址。有趣的是,MathWalsWe:我认为C++是因为C++才这样做的,即使C通常不使用地址作为C++的对象标识符。@ DavidHeffernan,我将学习一些东西,如果你解释了<代码> new EvType(.Engices)(new Enter())< /C> >返回true。它不需要堆栈上的实际地址吗?(我真的不熟悉JIT工作流);感谢
Equals()
检查结构的值相等性。由于没有字段,
s1.Equals(s2)
对于类型为
EmptyResult
@KavehShahbazian的操作数,
Equals
方法执行成员式Equals。这两个
Empty
对象的所有(零)成员都相等,因此这两个结构是相等的。它只是默认相等运算符比较引用的引用类型。@Servy Holly Foo!我忘了我在这里处理的是一个值类型!