洛伊 發問時間: 電腦與網際網路程式設計 · 1 0 年前

VB.NET Dispose和Finalize的使用時機

在 VB.NET 2005 中

再寫類別(Class)時, 一定要實做介面 IDisposable嗎?

' Design pattern for a base class.

Public Class Base

Implements IDisposable

'以下是實作 IDisposable 自動產生的程式碼

' Keep track of when the object is disposed.

Protected disposed As Boolean = False

' This method disposes the base object's resources.

Protected Overridable Sub Dispose(ByVal disposing As Boolean)

If Not Me.disposed Then

If disposing Then

' Insert code to free unmanaged resources.

End If

' Insert code to free shared resources.

End If

Me.disposed = True

End Sub

#Region " IDisposable Support "

' Do not change or add Overridable to these methods.

' Put cleanup code in Dispose(ByVal disposing As Boolean).

Public Sub Dispose() Implements IDisposable.Dispose

Dispose(True)

GC.SuppressFinalize(Me)

End Sub

Protected Overrides Sub Finalize()

Dispose(False)

MyBase.Finalize()

End Sub

#End Region

End Class

Dispose 和 Finalize 的使用時機要如何搭配?

2 個解答

評分
  • 大豬
    Lv 4
    1 0 年前
    最佳解答

    由於 .NET 物件 並沒有真正(如理想物件導向語言)的 destructor, 所以, 好的 Class 設計, 就應手動 release 資源(如 檔案, 資料庫連結, COM port,...)

    guideline:

    1. 如果物件會用到除記億体外之資源, 你應該寫 IDispose() (不管是直接方式 , 或間接方式<透過.net>)

    2. 你應該寫 Finalize(), 只在直接使用 unmanaged 資源

    換一種說明

    case1:

    只用到如記億体, 則IDispose() & Finalize() 都不用

    case2:

    透過.NET用到如 檔案, 資料庫連結, COM port,...

    只用IDispose()

    case3:

    IDispose() & Finalize() 都用, 例如用PInvoke直接使用資源, 而這些資源需要explicit deallocation

    case4:

    只用Finalize(), 很少見 (例如: 你想在物件消滅前做一些事)

    參考資料: MS Press 的書
  • marven
    Lv 4
    4 年前

    Vb.net Finalize

還有問題?馬上發問,尋求解答。