【发布时间】:2015-10-08 16:57:01
【问题描述】:
我有一个包含文件流的对象。文件流将在对象的生命周期内打开。我希望在对象没有更多引用时关闭文件流,但在此之前 从不。如果在对象上调用 Dispose(),则文件被释放,但对象可能仍有引用。在那之后调用其他方法将不安全,因为文件已经被释放,所以我需要在每个方法的开头实施检查以确保文件仍然有效(浪费运行时间)。
似乎将 Dispose() 设为私有可以解决这个问题,但话又说回来,我理解当对象没有更多引用时可能不会立即调用析构函数 - 所以基本上我必须公开一个 Dispose()调用者自己清理的方法。这不是违背了“智能”内存管理的目的吗?有什么办法可以解决这个问题吗?
【问题讨论】:
-
所以你不相信对象的用户只在他们不再需要对象时才 Dispose ?如果之前调用过
Dispose,为什么不直接重新打开文件? -
您不必手动操作。 AOP可以注入调用:github.com/Fody/Janitor
-
这将涉及检查文件是否先前已被处理。如果对象可以假定文件始终处于打开状态会更好。没有不必要的条件。
-
这样写毫无意义,永远不要实现自己的垃圾收集器。您已经有一个,如果该对象没有引用,那么它将被收集。 FileStream 也会自动被收集,不需要任何帮助。
-
我没有实现我自己的收集器。我的理解是,析构函数是在 GC 的心血来潮时调用的,每当感觉像这样......所以如果我没有明确地处理文件,它将保持打开状态,直到调用 GC 或 Dispose()方法被调用。
标签: c# memory-management dispose