2017-01-05 8 views
0

c# では、これは効率的なプログラミングですか?バーチャルICollection

t1がt2にリンクしていて、t2がt1にリンクしているので、それは自分自身にリンクしていますので、それはより多くのスペースを取るか、危険なアルゴリズム/コードですか?

static void Main(string[] args) 
{ 
    Test t1 = new Test(1); 
    Test t2 = new Test(2); 
    Test t3 = new Test(3); 
    Test t4 = new Test(4); 
    t1.Links = new List<Test>(); 
    t1.Links.Add(t2); 
    t2.Links = new List<Test>(); 
    t2.Links.Add(t1); 

    Console.WriteLine(t1.Links.First().Links.First().id); 
    Console.Read(); 
    return; 
} 

public class Test 
{ 
    public int id { get; set; } 

    public virtual ICollection<Test> Links { get; set; } 

    public Test(int Id) 
    { 
     id = Id; 
    } 
} 

私はこのタイプの構造をMVCで使用しています。私はMVCも主なオブジェクトと一緒にDBからこれらの仮想オブジェクトを読み込むことに気付いたので、それは問題であるかどうか疑問に思っていた。

+0

可能な複製(http://stackoverflow.com/questions/8840567/garbage-collector-and-circular-reference)あなたは、そのオブジェクトツリーでアーカイブしようとしている何 –

+2

?あなたの問題が循環参照を持つデータ構造を必要とする場合、そのようなデータ構造を作成することはOKです...そこには何も危険はありません;) – JanDotNet

+0

@JanDotNetと同様に、何も悪いことはありません。より良い構造を作成することで、時間/空間を安全にすることができます。あなたは確かに1つのリストをここで確実に安全にすることができます...しかし、それは本当にあなたがアーカイブしたいものに依存します。 – Cataklysim

答えて

1

インスタンス間の循環参照の主な問題は、プログラム実行中のデータのこれにより、可能な循環参照を予測して検出する必要があるため、多くのコードがより複雑になります。

コードに本質的に間違いはありませんが、まず循環参照が本当に必要かどうかを考える必要があります。データを表現するための、より洗練された方法が他にもあります。

1

循環参照が論理的に使用されているだけであれば問題ありません(たとえば、子ノードと親ノードを持つツリーノードでCRも発生します)。

いくつかのケースではCRが痛みますが、重大な何もすることができます:

  • シリアライズ:デフォルトのバイナリシリアルそれらを正しく処理しますが、関係なく、あなたが本当にシリアライズするノードのグラフ全体をシリアル化する可​​能性があります。このような問題を避けるために、カスタマイズを使用することもできます。 XML、json、および他の種類のシリアライゼーションも同様の考慮事項を考慮に入れることができます。
  • ガベージコレクション:少なくとも1つのノードがどこかから参照されるまで、オブジェクトグラフは解放されません。オブジェクトを1つずつリリースしたい場合は、削除時にそれらのリンクを正しく解除するか、ディスポーザブルにして、配置されたオブジェクトへの参照をすべて削除してください。
[ガベージコレクタと循環参照]の
関連する問題