簡體   English   中英

使用 c# 結構域 model 中的循環引用

[英]Circular reference in domain model using c# struct

當兩個結構之間存在循環引用時會發生什么? 對於下面的示例,memory 分配是如何工作的,還是會產生錯誤?

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

    public struct Option
    {
        public MultipleChoiceQuestion Question;
    }

MultipleChoiceQuestion中的Options字段在這里只是一個參考,默認為null Option中的Question字段是MultipleChoiceQuestion類型的值,默認情況下將具有其默認值。 這里沒有問題(除了在多個方面有問題的設計)。

導致邏輯 memory 問題的真正循環引用將無法編譯:

struct Foo
{
    Bar bar;
}

struct Bar
{
    Foo foo;
}

Test.cs(6,9):錯誤 CS0523:“Bar”類型的結構成員“Foo.bar”導致結構布局中出現循環 Test.cs(11,9):錯誤 CS0523:結構成員“Bar.foo” 'Foo' 類型導致結構布局中的循環

問題(屬性)是封裝; 問題是外部結構的一部分,通過一個字段。

然而,選項是對產生一個或多個選項的外部 object 的引用 每次都會復制這些。

這里還有其他幾個錯誤:

  • 可變結構: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;}
}

MultipleChoiceQuestion將簡單地引用(指針)指向 IEnumerable 的 object,因此堆棧上該結構的大小將是單個 IntPtr(x86 機器上的 4 個字節)。

Option結構將具有相同的大小,因為它僅包含MultipleChoiceQuestion結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM