2011-12-20 15 views
1

私は、オブジェクトを持っているオブジェクトのパブリックプロパティはオブジェクトへの参照を有効に保ちますか?

public class ExpensiveObject(HttpContext context, ....) 
{ 
    public Stream OnlyCareAboutThisStream { get; private set; } 
} 

私はOnlyCareAboutThisStreamへの参照を保持したいのですが、本当に高価ですExpensiveObject、気にしないでください。

どのようなオプションがありますか?ストリームをコピーする必要がありますか?具体的には、このオブジェクト(OnlyCareAboutThisStream)を、バックグラウンドスレッドでディスクにゆっくりと書き込むキューにキューイングします。

答えて

3

それはあなたが求めているものを完全には明らかではないのですが、あなたは、このようなコードを考慮している場合:

ExpensiveObject expensive = new ExpensiveObject(context); 
Stream stream = expensive.OnlyCareAboutThisStream; 

をその後、高価なオブジェクトが使用していないと仮定すると、二行目の後にガベージコレクションの対象となりますその "親"高価なオブジェクトへの参照を持ついくつかのカスタムストリーム。

+0

ふう私はそう思っていました... GCがどのようにこれを追跡しているのかわかりません。このクラスの中にオブジェクトが作成されたので、このオブジェクトを生かしておくようなGCがあると思います。しかし、私はそれが理にかなっていると思います... – halivingston

+0

@ user986697:いいえ - なぜGCはオブジェクトが作成されたかを気にしますか?それが気にするのは、後でどのオブジェクトを参照できるかだけです。 –

0

いいえ、ストリームをコピーする必要はありません。単に他の場所からStreamへの参照を保持し、ExpensiveObjectがスコープから外れるようにしてください。

あなたのExpensiveObjectにIDisposableインターを実装し、明示的に(これは相互に排他的WRT ExpensiveObjectがスコープ外になるだろうが)、それを処分することもできます。

public class ExpensiveObject(HttpContext context, ....) : IDisposable 
{ 
    public Stream OnlyCareAboutThisStream { get; private set; } 
} 

...

Stream myStream = null; 
using (var exObj = new ExpensiveObject(context)) 
{ 
    myStream = exObj.OnlyCareAboutThisStream; 
} 
関連する問題