Making IDispose::Dispose() private

本文关键字:private Dispose IDispose Making | 更新日期: 2023-09-27 18:16:52

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

似乎把Dispose()设为私有可以解决这个问题,但是,我明白,当对象没有更多的引用时,析构函数可能不会立即被调用——所以基本上我必须公开一个Dispose()方法,让调用者自己进行清理。这是否违背了"智能"内存管理的目的?是否有其他方法可以解决这个问题?

Making IDispose::Dispose() private

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

您应该实现IDisposable并在每次调用之前检查对象的状态。如果对象已被处置,则抛出ObjectDisposedException