为什么C#中的类没有循环布局问题?

public struct Unit { Unit u; } 

原因:

类型为“单元”的结构成员“Unit.u”会在结构布局中生成一个循环。

 public class Unit { Unit u; } 

编译。 我理解我认为的问题。 引用Unit对象时将形成无限循环,因为它必须初始化另一个成员Unit ,依此类推。 但是为什么编译器只为structs限制问题呢? 这个问题也不存在于class吗? 我错过了什么吗?

问题在于布局

Unit是结构时, Unit任何值都必须包含相同类型的另一个值(因此大小相同),无限制。 这不可能。 我想你可以争辩说,如果没有其他字段, Unit的字段应该不占用内存,所以你可以在其中包含它 – 但我相信CLR的工作方式确保所有结构占用至少1个字节……

Unit是一个类时, Unit对象只需要包含对另一个Unit对象的引用 。 没有存储问题,并且值可以为null。

可以这样想:你不能拥有一栋房子,其中包含另一栋由同一块蓝图构成的房屋,但你当然可以拥有一栋房子,里面有一张纸,上面有类似房屋的地址……

类是引用类型,所以我想不同的是,在class示例中,它只需要保存对另一个实例的引用。 对于你的struct ,一个值类型,它需要再次包含整个结构,因此是一个无限循环。

struct使用值自动初始化,因此在您的示例中, Unit值包含Unit值,其中包含Unit值,其中包含Unit值等…

您的class示例仅将引用初始化为null ,该引用没有无限回归。 但是,如果您执行以下操作,则会遇到类似的问题:

 class Unit { Unit mUnit = new Unit(); } 

现在,构造一个Unit构造一个Unit ,它构造一个Unit等等……在这种情况下,如果/当你试图实例化一个Unit对象时,你将遇到一个运行时堆栈溢出exception。

我认为您可以通过使用可空类型来避免struct问题,但问题仍然存在。 我相信这是因为当设置为null时,仍然可以实例化可为空的struct

因为Structvalue typeUnit可以保持价值吗? 我认为这是不可能的。

但是当Unitclassclassreference typeUnit对象可以保存对另一个Unit对象的引用 。 没事。