确保对象公共属性使对对象的引用保持活动状态
本文关键字:对象 引用 活动状态 属性 确保 | 更新日期: 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;
}