[英]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 的引用; 每次都會復制這些。
這里還有其他幾個錯誤:
海事組織:
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.