ガベージコレクション(以下GC)の話をしましたが、Classの良い所は前処理と後処理が出来るところだと思いますが、
.NETではFinalizeの実装はされていますが、これはGCのせいで、いつ呼び出されるか分かりません。
そのためプログラマは開放処理を狙って行えない!
メモリーの解放はシカトでもファイルのIOやDBのIOなど後処理をしたいClassが沢山ある:evil:
「Finalize」は外部から意図的にCall出来ないので後処理としてはあまり使えません。
VB6の頃はオブジェクトの開放といえば「Set obj = Nothing」でしたが、.NETでは「obj.Dispose」となりました。
しかし、この「Dispose」くんはControlやFormなどには標準でインターフェイスとして付いてますが、
プログラマが独自にClassを作成するときには明示してあげないと使えません・・・・・:sad:
そこで「Implements IDisposable」を実装して以下のようにしてあげます。
Public Class Class1
Implements IDisposable
'オブジェクトが破棄されたかどうかを追跡するためのフィールド。
Protected disposed As Boolean = False
Public Sub New()
End Sub
Protected Overrides Sub Finalize()
MyBase.Finalize()
Dispose(False)
End Sub
Public Overloads Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
'GCに対して自分を解放してくれ!と命令!
GC.SuppressFinalize(Me)
End Sub
'クラスのリソースを解放するオーバーロードされた Dispose メソッド。
'このメソッドは基本クラスの Dispose メソッドおよび Finalize メソッドから呼び出す必要があります。
Protected Overridable Overloads 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
End Class
ここで出てくる「GC.SuppressFinalize(Me)」はGCからメモリ開放してと御願いしているので、
メモリー開放まで行わない方はコメントでも良いでしょう。
まぁ普通は破棄のタイミングも考えて開発しますからあって、良い処理ですな:wink:
そして「Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean)」の中に
開放ロジックを書いてあげて、呼び出し元には必ず「obj.Dispose」を呼んで貰うようにすればOK
VB6の場合「Set obj = Nothing」
.NETの場合「obj.Dispose」
「Dispose」が無いものは書かなくても良い=後処理無いのでメモリーの解放はGCに任せる!でもOKだが・・・
やっぱり綺麗に書くことが何事にもプラスに働くはず☆