使IDispose :: Dispose()成为私有的

时间:2015-10-08 16:57:02

标签: c# memory-management dispose

我有一个包含文件流的对象。文件流将在对象的生命周期内打开。我希望在对象没有更多引用时关闭文件流,但在此之前从不。如果在对象上调用Dispose(),则会释放该文件,但该对象仍可能具有引用。在该点之后调用其他方法是不安全的,因为文件已经被处理掉了,所以我需要在每个方法的开头实现检查以确保文件仍然有效(浪费运行时间)。

似乎让Dispose()私有可以解决这个问题,但是再一次,我理解当对象没有更多引用时可能不会立即调用析构函数 - 所以基本上我必须公开一个Dispose ()方法让调用者自己做清理。这不会破坏" smart"的目的。内存管理,有什么方法吗?

1 个答案:

答案 0 :(得分:1)

如果没有对您的对象的更多引用,它将与内部文件流一起被垃圾收集。在GC期间,将执行file stream's finalizer并关闭文件。您不需要Dispose()来实现它。问题是您不知道GC何时运行。看起来你的对象有很长的生命周期,所以它可能在generation 2.它可能需要很长时间才能运行第2代GC。

您应该实施IDisposable并在每次通话前检查对象的状态。如果对象被丢弃,则抛出ObjectDisposedException