gpt4 book ai didi

vb.net - 为什么 VS2005/VB.NET 使用 Dispose(disposing as boolean) 重载实现 IDisposable 接口(interface)?

转载 作者:行者123 更新时间:2023-12-04 07:08:15 27 4
gpt4 key购买 nike

最近,我需要将 IDisposable 和对象终结的建议模式与 VS2005/VB.NET 提供的自动生成模式进行比较。我们已经使用了自动生成的一个,但是在并排查看它之后,我对 VB.NET 实现有很多疑问......

作为引用,这里是 IDE 的实现:

Public Class Class1
Implements IDisposable

Private disposedValue As Boolean = False ''// To detect redundant calls

''// IDisposable
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
''// TODO: free managed resources when explicitly called
End If

''// TODO: free shared unmanaged resources
End If
Me.disposedValue = True
End Sub

#Region " IDisposable Support "
''// This code added by Visual Basic to correctly implement the disposable pattern.
Public Sub Dispose() Implements IDisposable.Dispose
''// Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above.
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
#End Region

End Class

问题:
  • 如果在 GC 期间调用 Finalize() 而没有首先显式调用 object.Dispose() 则 disposing:=false 并且“if disposing...”中的代码将永远不会执行以释放托管资源 - 导致它们保留在内存中直到下一次GC通过。为什么不明确释放这些?这样做不会在第一次 GC 传递时释放更多内存,并且不会在下一次传递之前将不需要的对象留在内存中吗?
  • 为什么在 IDisposable 类上覆盖 Finalize() 时 IDE 不生成 Dispose(false) 调用?
  • GC 如何知道调用 Dispose(false) 并确保它是 IDE 的实现,而不是以不同方式使用 bool 参数的自定义实现?
    * ...如果 GC 测试它的存在并以假定某种实现的方式使用它(object.Dispose(disposing:=false)),Dispose(disposing as bool) 不应该是接口(interface)成员吗?
    * 在两个Dispose() 的情况下和 Dispose(disposing as boolean)为什么 GC 会选择调用重载的非接口(interface)成员?

  • 总的来说,我对在 Dispose() 时执行的扩展代码路径的假定附加值感到困惑。被显式调用(与不管 Dispose() 是否被显式调用都执行的公共(public)路径相反)。虽然我可以理解它是出于善意提供的,但如果 Dispose() 会延迟托管资源的实际释放,我看不出它有什么作用。不直接调用。从本质上讲,它似乎只能使对象图中的托管资源无法访问,将它们孤立起来直到第二次 GC 运行,而不是在已知不再需要它们的时候释放它们。

    最佳答案

    您的问题存在逻辑错误...如果 Dispose()在终结器中调用,那么是的,disposedValue将为假,这意味着 If Not Me.disposedValue Then...将执行。为 disposing 传递的参数是 true ,所以那里的所有代码都应该执行得很好。

    编辑
    (结果是终结器调用 Dispose(false))

    表单上的终结器(仅在表单上从未调用 Dispose() 时运行)调用 Dispose(false) .原因是 Form目前正在GC'ed。结果,MANAGED 资源(即 Form 上的组件)将被收集,它们自己的终结器应调用 Dispose()如果需要。 Dispose(false) 中只应释放非托管资源.

    关于vb.net - 为什么 VS2005/VB.NET 使用 Dispose(disposing as boolean) 重载实现 IDisposable 接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/773165/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com