对象公共属性是否保持对对象的引用?

时间:2011-12-20 11:28:52

标签: c# garbage-collection reference backgroundworker

我有一个对象,

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

我想持有对OnlyCareAboutThisStream的引用,但不关心ExpensiveObject,它真的很贵。

我有哪些选择?我需要复制流吗?详细说明,我将把这个对象(OnlyCareAboutThisStream)排队到一个将在后台线程中慢慢写入磁盘的队列中。

2 个答案:

答案 0 :(得分:3)

你要问的是什么并不完全清楚,但如果你正在考虑这样的代码:

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

那么昂贵的对象将有资格在第二行之后进行垃圾收集,假设它没有使用一些自定义流,它引用了它的“父”昂贵的对象。

答案 1 :(得分:0)

不,您不需要复制流。只需从其他地方保持对Stream的引用,并允许ExpensiveObject超出范围。

您可能希望在ExpensiveObject上实现IDisposable并明确处理它(尽管这是与ExpensiveObject超出范围的互斥WRT):

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

...

Stream myStream = null;
using (var exObj = new ExpensiveObject(context))
{
    myStream = exObj.OnlyCareAboutThisStream;
}
相关问题