クラスのオブジェクトを作成すると
A obj = new A();
後で割り当てnull
ます: obj = null;
.
では、obj が null であるとはどういう意味ですか? それは今、それがどこを指していないことを意味し、すべてのメモリの割り当てが解除されていますか?
クラスのオブジェクトを作成すると
A obj = new A();
後で割り当てnull
ます: obj = null;
.
では、obj が null であるとはどういう意味ですか? それは今、それがどこを指していないことを意味し、すべてのメモリの割り当てが解除されていますか?
obj
null
現在、参照メモリの場所を指しています。
MSDN のnull (C# リファレンス)から:
null キーワードは、オブジェクトを参照しない null 参照を表すリテラルです。
以前に指していたオブジェクトを他のものに割り当てていない場合、そのオブジェクトは GC によるコレクションの対象になります。
これは、それがどこも指していないことを意味し、メモリは将来の未定義の時間にガベージ コレクターによる割り当て解除の対象となります。
null
はオブジェクトではありません。何も参照しない特別な参照値です。参照を使用してオブジェクトと通信しようとするnull
と、オブジェクトがないため、エラーがスローされます。
特別な場合を必要とする参照の問題を解決するために作成されたNull Object Patternと呼ばれる設計パターンもあります。null
このパターンのnull オブジェクトは、「ニュートラル」な動作を持つオブジェクトです。つまり、何かをするように頼まれても実際には何もせず、値を返すように頼まれても、ゼロ、空の文字列、空のリスト、およびその他の安全でニュートラルなオブジェクトを返します。
null オブジェクトと特別なnull
参照を混同しないでください。
内部的には、このオブジェクトがルートと見なされないことを意味します。使用可能なオブジェクト グラフには追加されません。
したがって、収集可能と見なされます。(非決定的な時間。)
参照型 (クラス) は、実際にはメモリ内のデータへのポインターであることを理解する必要があります。基本的に、ポインタ (データのアドレスを含む単なるメモリの一部) を値ゼロまたは null に設定します。
実際には、これは、データへの他の参照が残っていない場合、ガベージ コレクターがそのデータをいつでも削除できることを意味します。
技術的には、あなたが言うときobj
のタイプのオブジェクトを含むヒープ上のメモリ位置の代替名ですA
A obj = new A();
しかし、あなたが言うならobj = null;
、obj
今はどこにも言及していません。
また、タイプ A のオブジェクトによって以前に占有されていたメモリもobj
、GC が適切なタイミングであると判断したときに、GC によってオペレーティング システムに返されます。
obj = 新しい A();
参照変数objはA型です。Aのインスタンスを作成し、その参照をobjに割り当てています。objはAのインスタンスを参照するようになりました。
オブジェクト = ヌル
上記の割り当ては、objがnullを参照するようになったことを示しています。それは何もありません。新しく作成されたA のインスタンスは参照されなくなり、最終的にはガベージ コレクションが実行されます。
これはobj
どこにもポイントしないことを意味し、タイプの元の参照されたインスタンスはA
gen0 に移動します。A
が実装された型である場合IDisposable
、A が保持するリソースは、Dispose
呼び出されたときに解放され、ファイナライズされるために抑制されます。使い捨てが明示的に破棄されていない場合、ファイナライズされるまで待機します。
後で実行がそれを再度参照し、それが gen1 に続き、場合によっては gen2 になると、その寿命は長くなります。
gc がガベージを収集するようになると、gen0 が最初に収集され、次に gen1、gen2 が選択されます。