【问题标题】:Making IDispose::Dispose() private将 IDispose::Dispose() 设为私有
【发布时间】:2015-10-08 16:57:01
【问题描述】:

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

似乎将 Dispose() 设为私有可以解决这个问题,但话又说回来,我理解当对象没有更多引用时可能不会立即调用析构函数 - 所以基本上我必须公开一个 Dispose()调用者自己清理的方法。这不是违背了“智能”内存管理的目的吗?有什么办法可以解决这个问题吗?

【问题讨论】:

  • 所以你不相信对象的用户只在他们不再需要对象时才 Dispose ?如果之前调用过Dispose,为什么不直接重新打开文件?
  • 您不必手动操作。 AOP可以注入调用:github.com/Fody/Janitor
  • 这将涉及检查文件是否先前已被处理。如果对象可以假定文件始终处于打开状态会更好。没有不必要的条件。
  • 这样写毫无意义,永远不要实现自己的垃圾收集器。您已经有一个,如果该对象没有引用,那么它将被收集。 FileStream 也会自动被收集,不需要任何帮助。
  • 我没有实现我自己的收集器。我的理解是,析构函数是在 GC 的心血来潮时调用的,每当感觉像这样......所以如果我没有明确地处理文件,它将保持打开状态,直到调用 GC 或 Dispose()方法被调用。

标签: c# memory-management dispose


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2013-03-16
    • 2015-04-21
    相关资源
    最近更新 更多