使用c#struct在域模型中的循环引用

时间:2011-07-04 16:26:09

标签: c# circular-reference

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

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

    public struct Option
    {
        public MultipleChoiceQuestion Question;
    }

3 个答案:

答案 0 :(得分:3)

Options中的MultipleChoiceQuestion字段只是此处的引用,默认情况下为nullQuestion中的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)

问题(财产)是封装;这个问题是外部结构的一部分,通过一个领域。

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

这里还有其他一些错误:

  • 可变结构:EVIL
  • 公共字段:EVIL
  • 选项会更好作为列表;不是所有的可枚举都是可重复的
  • 它们不是“价值” - 所以它们不应该是结构;使用类

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结构。