ブロック終了後
{
}
ブロック内の変数はどうなりますか?
{
int a;
a=2;
int b = 3;
}
//What happened now???
そして、このブロックの後に何が起こるか
{
int a=2;
int b = 3;
}
GC.Collect();
それは明らかですか?選択したタグが間違っている場合は編集してください。質問を明確にするために編集できる場合は編集してください。
ブロック終了後
{
}
ブロック内の変数はどうなりますか?
{
int a;
a=2;
int b = 3;
}
//What happened now???
そして、このブロックの後に何が起こるか
{
int a=2;
int b = 3;
}
GC.Collect();
それは明らかですか?選択したタグが間違っている場合は編集してください。質問を明確にするために編集できる場合は編集してください。
ブロックの最後で、内部で宣言されたすべての変数は「スコープ外」になります。
ほとんどの場合、それらはスタックからポップされますが、詳細はオプティマイザーに影響します。
また、サンプル変数はすべてint
s (ValueTypes) であるため、ガベージ コレクションとは関係ありません。
最後の例を次のように変更すると:
{
int a=2;
var b = new StringBuilder();
...
}
GC.Collect();
次に、StringBuilder のメモリが GC.Collect() で収集されます。通常のプログラムでは GC.Collect() を呼び出す必要がないことに注意してください。
ブロック内の参照変数は範囲外になります。ガベージ コレクションによってマークされると、参照がなくなるため、マークされたままになります。参照変数がないため、GC は関与しません。
ある時点で、ガベージ コレクターが実行され、参照変数によって使用されるメモリをクリアできるかどうかが決定されます。これは世代によって異なるため、すぐには削除されない場合があります。
呼び出しGC.Collect();
は単に GC を強制的に実行しますが、コレクションは確実ではありません。これは、ほとんどのアプリケーションでは必要ありません。
ブロックの最後で、ブロック内で宣言された変数は範囲外になります。値型 (int など) の場合は、単にスタックからポップされます。それらが参照型である場合 (他のほとんどのオブジェクトのようにStringBuilder
)、それらは (まだスコープ内にあるブロック外のものに渡さない限り) 何によっても参照されなくなり、後でガベージ コレクターがそれを取得します。
Stream
さまざまなベース クラス (または を実装するもの)のように、希少なリソースにアクセスするオブジェクトがある場合は、IDisposable
それを次のような using ステートメントに入れる必要があります。
using (Stream s = GetStream())
{
// Do something with the stream.
}
using ブロックの最後でDispose
メソッドが呼び出され、すべてのリソースが解放されます (ファイル ハンドラー、データベース接続、大量のメモリなど)。
一般に、ガベージ コレクタがいつ実行され、メモリが解放されるかを正確に理解する必要はありません。delete
2002 年に C++ から .NET に移行したとき、ヒープ上に作成したオブジェクトを呼び出すことに慣れていたため、理解するのが最も困難でした。
もうこれについて心配する必要はありません。dispose を呼び出すのを忘れたとしても、ガベージ コレクターは最終的にそれに到達します (おそらく、そのファイル ハンドルを必要以上に長く保持したくないでしょうIDisposable
) 。