当两个结构之间存在循环引用时会发生什么?内存分配如何适用于下面的示例,还是会产生错误?
public struct MultipleChoiceQuestion
{
public IEnumerable<Option> Options;
}
public struct Option
{
public MultipleChoiceQuestion Question;
}
答案 0 :(得分:3)
Options
中的MultipleChoiceQuestion
字段只是此处的引用,默认情况下为null
。 Question
中的Option
字段是MultipleChoiceQuestion
类型的值,默认情况下将具有默认值。这里没有问题(除了有问题的设计以外,还有多种方式)。
导致逻辑内存问题的正版循环引用将无法编译:
struct Foo
{
Bar bar;
}
struct Bar
{
Foo foo;
}
Test.cs(6,9):错误CS0523:类型为“Bar”的结构成员“Foo.bar”导致struct布局中的循环 Test.cs(11,9):错误CS0523:类型为'Foo'的结构成员'Bar.foo'导致结构布局中的循环
答案 1 :(得分:2)
问题(财产)是封装;这个问题是外部结构的一部分,通过一个领域。
然而,选项是 引用 到产生一个或多个选项的外部对象;这些都会被复制。
这里还有其他一些错误:
IMO:
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;}
}
答案 2 :(得分:0)
MultipleChoiceQuestion
将只有一个对象是IEnumerable的引用(指针),因此堆栈上该结构的大小将是一个IntPtr(x86机器上的4个字节)。
Option
结构将具有相同的大小,因为它只包含MultipleChoiceQuestion
结构。