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