2

当两个结构之间存在循环引用时会发生什么?对于下面的示例,内存分配是如何工作的,或者它会产生错误吗?

    public struct MultipleChoiceQuestion
    {
        public IEnumerable<Option> Options;
    }

    public struct Option
    {
        public MultipleChoiceQuestion Question;
    }
4

3 回答 3

3

这里的Options字段MultipleChoiceQuestion只是一个参考,null默认情况下。Questionin 字段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' 类型导致结构布局中的循环

于 2011-07-04T16:30:32.470 回答
2

问题(属性)是封装;问题是外部结构的一部分,通过一个字段。

然而,选项是对产生一个或多个选项的外部对象的引用;每次都会复制这些。

这里还有其他几个错误:

  • 可变结构:EVIL
  • 公共领域:邪恶
  • 选项作为一个列表会更好;并非所有可枚举项都是可重复的
  • 它们不是“值”——所以它们不应该是结构;改用类

海事组织:

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;}
}
于 2011-07-04T16:30:08.287 回答
0

MultipleChoiceQuestion仅具有对可 IEnumerable 对象的引用(指针),因此堆栈上该结构的大小将是单个 IntPtr (在 x86 机器上为 4 个字节)。

Option结构将具有相同的大小,因为它仅包含该MultipleChoiceQuestion结构。

于 2011-07-04T16:30:17.523 回答