.NETでは、オブジェクト自体の破棄はガベージコレクタ(garbage collector)によって行われます。 new
によって作成したあと、どこからも参照されなくなった・使用されなくなったオブジェクト(garbage)は定期的に収集(collect)されることにより、確保されていた領域が解放されます。 オブジェクトはnew
によって任意のタイミングで作成できる一方で、delete object;
のような構文を用いて明示的にオブジェクトを破棄・解放することはできません。
VB6以前ではNothing
を代入することでオブジェクトを破棄していましたが、.NETでは(C#/VBともに)null
/Nothing
を代入することはオブジェクトの破棄を明示的に指示するものにはなりません。 (オブジェクトの参照が破棄されることにより、ガベージコレクタによって収集されやすくなる可能性はあるが、不要になった時点でnull
/Nothing
を代入することは明確に推奨されてはいない)
Imports System
Imports System.Collections.Generic
Class Sample
Shared Sub Main()
Dim l As New List(Of String)(); ' オブジェクト(List)を作成する
l.Add("Hello, world!")
Delete l ' deleteのような、オブジェクトを明示的に破棄する構文はない
l = Nothing ' Nothingを代入することにより、確保したオブジェクトへの*参照を破棄する*ことはできる
' ただし、オブジェクトの破棄を指示するものとはならない
' 参照が破棄された(どこからも参照されなくなった)オブジェクトは、
' いずれかのタイミングでガベージコレクタによって収集・破棄される
End Sub
End Class
また、オブジェクトが保持(内包)しているオブジェクトもガベージコレクタによって自動的に収集されます。 このため、例えばコンストラクタでnew
したオブジェクトをファイナライザ(デストラクタ)で破棄する必要もありません。
ガベージコレクタによって管理(manage)され、収集対象となるマネージリソース(manage resources)の場合は、上記のように明示的に破棄・解放する必要はなく、そもそも明示的に破棄・解放することもできません。 一方、ガベージコレクタによって管理されない・収集対象外となるアンマネージリソース(unmanage resources)の場合は、確保した側の責任で破棄・解放を行う必要があります。
つまり、オブジェクト自体はガベージコレクタによって自動的に破棄・解放される一方、オブジェクトがアンマネージリソースを保持している場合、それらのリソースは明示的に破棄・解放を行う必要があります。