2011-12-20 77 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 2011-12-20 11:50:22

+0

@ user986697:否 - 爲什麼GC會關心創建對象的位置?所有它關心的是以後可以引用哪些對象。 – 2011-12-20 12:02:17

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; 
}