1

メソッド内でオブジェクト/変数を作成すると、メソッド呼び出しの後、すべてのオブジェクトが GC によって収集されるように設定され、すべての「プリミティブ」変数 (int、string、decimal...) が破棄されますよね?

はいの場合:

public void MyMethod()
{
    // Imagine an class that connects with ftp server
    MyObject o = new MyObject();
    o.Connect(); 
}

行にエラーがo.Connect()あり、try`catch only to log the error,MyObject o` がある場合、GC によって収集されますか?

4

3 に答える 3

1

ガベージコレクターが「収集」を行う時間は決まっていません。オブジェクトには3つの「世代」があり、コレクションを生き残った場合、オブジェクトは1世代上に昇格します。そうです、try / catchブロックでエラーを「キャッチ」すると、ガベージコレクターはオブジェクトによって占有されているメモリを解放します。

ガベージコレクションの詳細については、こちらをご覧ください

于 2012-08-30T13:05:03.827 に答える
0

GCは、スコープ内のどのオブジェクトからもオブジェクトに到達できなくなった後、しばらくしてオブジェクトを収集します。すぐに収集できない場合があるため、接続をすぐに終了したい場合は、IDisposableパターンとusingブロックを使用する必要があります。

(注:CLR GCの動作は単純ではなく、オブジェクトがいつ収集されるかについてはほとんど保証されません。一般的な経験則では、メモリを再利用するためにGCに依存しますが、接続などの他のリソースは処理します。 、明示的に。)

于 2012-08-30T13:04:05.620 に答える
0

コードを1行ずつ見てみましょう

public void MyMethod()
{
    MyObject o = new MyObject(); // local object
    o.Connect();
} // object o now goes out of scope and becomes subject for GC

しかし、あなたがまだエラーをログに記録できるかどうかは、あなたの質問の性質にあると思います。答えはイエスです。次の 2 つのシナリオが考えられます。

  • o.Connect同期です。つまり、}すべてのロジックが実行される前に最後の行に到達することはありません。
  • o.Connect非同期です。私はそれを と呼びましょう。つまり、接続が魔法を実行するのを待たずにo.ConnectAsync、最後のストレートをヒットします。}これはどのように可能ですか?これは、o.ConnectAsync(おそらく) 別のスレッドで実行されるため可能です。の作業スレッドはオブジェクトo.ConnectAsyncへの参照を保持するため、oGC の対象にはなりません。async メソッドが終了した後でのみo、GC で使用できるようになります。
于 2012-08-30T13:25:13.027 に答える