【问题标题】:C# - free all resources used by an objectC# - 释放对象使用的所有资源
【发布时间】:2010-05-17 15:44:01
【问题描述】:

有没有办法释放某个对象使用的所有资源?

如果不是,我为什么不使用GC.Collect() 方法?

【问题讨论】:

    标签: c# garbage-collection memory-management


    【解决方案1】:

    具有资源的类型应该实现IDisposable,并通过调用Dispose(或将它们包装在using 语句中)来释放这些资源。 GC.Collect 仅适用于具有资源但未实现 IDisposable 的写得不好的对象。

    【讨论】:

    • 是这样的,不幸的是:(
    • @Tesserex:这并不完全正确。引用非托管资源的类通常会实现终结器。终结器将由垃圾收集器执行。当然,具有非托管资源但没有终结器的类的设计不正确。
    • @user1112111:我会“推动”错误代码的生产者修复他们的代码。然而,GC.Collect 是一种让他们的坏代码工作的方法,至少就资源而言。另一方面,如果他们甚至不能正确地做到这一点,人们一定想知道他们的课程中潜伏着多少其他错误......
    • @Steven:正确,但我主要指的是用户在这里编写的类,因为我们正在讨论自己实现 IDisposable,所以他必须实现上述终结器。
    【解决方案2】:

    这取决于你的意思是什么资源。

    如果您只是在谈论内存,那么当不再有对该对象的任何引用时,GC 确实会为您处理。调用 GC.Collect 将提示 GC 运行,但永远无法保证 GC 何时运行,即使您调用 GC.Collect 因为它在单独的线程上运行。

    如果您谈论的是非托管资源,例如文件句柄、数据库连接等,那么管理这些资源的最佳方法是实现 IDispsable 接口,然后这些资源将由调用 Dispose 的代码调用者释放方法(或者实际上是通过 GC 处理您的对象)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 2011-06-26
      相关资源
      最近更新 更多