public struct Unit
{
Unit u;
}
原因:
'Unit' 类型的结构成员 'Unit.u' 在结构布局中导致循环。
但
public class Unit
{
Unit u;
}
编译。我理解我认为的问题。引用一个Unit
对象时会形成一个无限循环,因为它必须初始化另一个成员Unit
等等。但是为什么编译器只限制问题structs
呢?问题不是也一直存在class
吗?我错过了什么吗?
public struct Unit
{
Unit u;
}
原因:
'Unit' 类型的结构成员 'Unit.u' 在结构布局中导致循环。
但
public class Unit
{
Unit u;
}
编译。我理解我认为的问题。引用一个Unit
对象时会形成一个无限循环,因为它必须初始化另一个成员Unit
等等。但是为什么编译器只限制问题structs
呢?问题不是也一直存在class
吗?我错过了什么吗?
问题在于布局。
当Unit
是一个结构时,a 的任何值Unit
都必须包含另一个相同类型(因此大小相同)的值,无穷无尽。这不可能。我想您可能会争辩说,在没有其他字段的情况下,字段 forUnit
不应该占用内存,因此您可以将其包含在自身中 - 但我相信 CLR 的工作方式可确保所有结构至少占用 1 个字节......
当Unit
是一个类时,一个Unit
对象只需要包含对另一个对象的引用。Unit
没有存储问题,并且值可以为 null 开始。
可以这样想:你不能有一所房子包含另一所用相同蓝图建造的房子,但你当然可以有一所房子包含一张纸,上面有类似房子的地址......
类是引用类型,所以我想不同之处在于在class
示例中,它只需要保存对另一个实例的引用。对于您struct
的值类型,它需要再次包含整个结构,因此是无限循环。
会struct
自动使用一个值初始化,因此在您的示例中,一个Unit
值包含一个Unit
值,该值包含一个值,该Unit
值包含一个Unit
值,等等...
您的class
示例仅初始化对 的引用null
,它没有无限回归。但是,如果您执行以下操作,您会遇到类似的问题:
class Unit
{
Unit mUnit = new Unit();
}
现在,构造 aUnit
构造 a Unit
,构造 aUnit
等......在这种情况下,如果/当您尝试实例化Unit
对象时,您将遇到运行时堆栈溢出异常。
我认为您可以struct
通过使用可为空的类型来避免该问题,但问题仍然存在。我相信这是因为struct
当设置为null
.
因为Struct
是value type
。Unit
可以保持价值本身吗?我认为这是不可能的。
但什么时候Unit
是class
,class
是reference type
。Unit
object 可以持有对另一个对象的引用Unit
。没事。