为什么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
。
因为Struct
是value type
。 Unit
可以保持价值吗? 我认为这是不可能的。
但是当Unit
是class
, class
是reference type
。 Unit
对象可以保存对另一个Unit
对象的引用 。 没事。