【问题标题】:Circular reference in domain model using c# struct使用 c# struct 域模型中的循环引用
【发布时间】:2011-07-04 16:26:08
【问题描述】:

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

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

    public struct Option
    {
        public MultipleChoiceQuestion Question;
    }

【问题讨论】:

  • 根据经验,你不应该在结构中包含引用类型
  • @BrokenGlass,你有更多信息吗,也许是进一步阅读的链接。 TIA
  • @BrokenGlass 没有字符串吗? :p
  • yaya 让我到了那里;-) 无论如何,字符串非常特别。 @John K:我想问题在于只有当您引用了可变引用类型时,复制和比较语义总是让我到达那里,所以我个人尽量避免在结构中完全使用大多数引用类型(无论如何我很少使用)

标签: c# circular-reference


【解决方案1】:

MultipleChoiceQuestion 中的Options 字段在这里只是一个参考,默认为nullOption 中的 Question 字段是 MultipleChoiceQuestion 类型的值,默认情况下将具有其默认值。这里没有问题(除了在多个方面有问题的设计)。

导致逻辑内存问题的正版循环引用将无法编译:

struct Foo
{
    Bar bar;
}

struct Bar
{
    Foo foo;
}

Test.cs(6,9):错误 CS0523:“Bar”类型的结构成员“Foo.bar”导致结构布局中出现循环 Test.cs(11,9): 错误 CS0523: 'Foo' 类型的结构成员 'Bar.foo' 导致结构布局中出现循环

【讨论】:

  • 你在乔恩身上。我有一点大脑冻结/盲点忘记列表将是一个引用类型。
【解决方案2】:

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

但是,

Options 是对产生一个或多个 Options 的外部对象的 reference;每次都会复制这些内容。

这里还有其他几个错误:

  • 可变结构:邪恶
  • 公共字段: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;}
}

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 2015-10-28
      • 2021-08-28
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多