确保对象公共属性使对对象的引用保持活动状态

本文关键字:对象 引用 活动状态 属性 确保 | 更新日期: 2023-09-27 18:18:18

我有一个对象

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

我想保存一个对OnlyCareAboutThisStream的引用,但不关心ExpensiveObject,它确实是昂贵的。

我有什么选择?我需要复制流吗?为了详细说明,我将把这个对象(OnlyCareAboutThisStream)排队到一个queue中,这个queue将在后台线程中缓慢地写入磁盘。

确保对象公共属性使对对象的引用保持活动状态

你问的不是很清楚,但是如果你考虑这样的代码:

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

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

不,您不需要复制流。只需从其他地方保存对流的引用,并允许ExpensiveObject超出作用域。

你可能想在你的ExpensiveObject上实现IDisposable并显式地处置它(尽管这是互斥的,当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;
}