当两个结构之间存在循环引用时会发生什么?对于下面的示例,内存分配是如何工作的,或者它会产生错误吗?
public struct MultipleChoiceQuestion
{
public IEnumerable<Option> Options;
}
public struct Option
{
public MultipleChoiceQuestion Question;
}
当两个结构之间存在循环引用时会发生什么?对于下面的示例,内存分配是如何工作的,或者它会产生错误吗?
public struct MultipleChoiceQuestion
{
public IEnumerable<Option> Options;
}
public struct Option
{
public MultipleChoiceQuestion Question;
}
这里的Options
字段MultipleChoiceQuestion
只是一个参考,null
默认情况下。Question
in 字段Option
是一个类型的值MultipleChoiceQuestion
,默认情况下将具有其默认值。这里没有问题(除了在多个方面有问题的设计)。
导致逻辑内存问题的真正循环引用将无法编译:
struct Foo
{
Bar bar;
}
struct Bar
{
Foo foo;
}
Test.cs(6,9):错误 CS0523:“Bar”类型的结构成员“Foo.bar”导致结构布局中出现循环 Test.cs(11,9):错误 CS0523:结构成员“Bar.foo” 'Foo' 类型导致结构布局中的循环
问题(属性)是封装;问题是外部结构的一部分,通过一个字段。
然而,选项是对产生一个或多个选项的外部对象的引用;每次都会复制这些。
这里还有其他几个错误:
海事组织:
public class MultipleChoiceQuestion
{
private readonly List<Option> options
= new List<Option>();
public IList<Option> Options {get { return options; } }
}
public class Option
{
public MultipleChoiceQuestion Question {get;set;}
}
将MultipleChoiceQuestion
仅具有对可 IEnumerable 对象的引用(指针),因此堆栈上该结构的大小将是单个 IntPtr (在 x86 机器上为 4 个字节)。
该Option
结构将具有相同的大小,因为它仅包含该MultipleChoiceQuestion
结构。