【发布时间】:2019-01-22 08:30:56
【问题描述】:
这是这个问题的后续问题:
Finalize/Dispose pattern in C#
所以我明白,如果我正在创建一个使用非托管资源的类,我应该处置它们。链接问题中的答案说终结器处理了非托管资源。但是,Dispose(Boolean) 方法也在处理非托管资源:
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// get rid of managed resources
}
// get rid of unmanaged resources
}
那么finalizer的dispose和dispose方法的dispose有什么区别呢?
【问题讨论】:
-
正如您在接受的答案中看到的那样,终结器 - 如果存在 .- 通常会调用您的
Dispose- 方法,其标志为false。 -
垃圾收集器负责收集垃圾并调用终结器。请注意,不能保证完全会收集垃圾(或者如果会,何时会完成)。相反,
Dispose被手动调用(通常在离开using范围时)。 -
所以终结器只存在于调用 Dispose 方法以防用户忘记自己调用它?
-
是的,终结器的存在是为了确保尽可能释放非托管资源。未释放的非托管资源可能会造成严重破坏 - 想象一下文件句柄在应用程序的生命周期内错误地保持打开状态。
-
是的,只要你遵循 Dispose() 模式,那就是真的。
标签: c# idisposable finalizer