4

私は Web アプリケーションに取り組んでおり、次の状況に遭遇しました。

Dim a as Object
Dim i as Integer = 0

Try

    For i=1 to 5

        a = new Object()

        'Do stuff '

        a = Nothing

    Next

Catch

Finally

   a = Nothing

End Try

ループ内で a=Nothing を実行する必要がありますか? それともガベージ コレクターが a をクリーンアップしますか?

4

5 に答える 5

12

.NET では、通常、変数参照 = ( C# では)を設定する必要はありません。ガベージ コレクターは最終的にクリーンアップします。参照自体は、スコープ外になると破棄されます (メソッドが終了するとき、またはこのクラスのオブジェクトがファイナライズされるとき)。これは、オブジェクトが破棄されることを意味するのではなく、オブジェクトへの参照だけであることに注意してください。オブジェクトは、コレクターによって非決定論的に破棄されます。Nothingnull

ただし、 reference =Nothingを設定すると、オブジェクトがガベージである可能性があり、コードの乱雑さを除けば、必ずしも何も害を及ぼすわけではないというヒントが.NETに提供されます。そこに保持する場合は、Tryブロックから削除することをお勧めします。すでにFinallyブロックにあるため、常に呼び出されます。(特定の壊滅的な例外は別として。ただし、そのような場合は、Tryブロック内でも呼び出されません!)

最後に、私は Greg に同意することを認めなければなりません。これがなければ、あなたのコードはよりきれいになります。参照が完了したというランタイムへのヒントは素晴らしいですが、確かに重要ではありません。正直なところ、これをコード レビューで見たら、おそらく開発者に次のように書き直してもらいます。

Dim a as Object
Dim i as Integer = 0

For i=1 to 5
    a = new Object()
    'Do stuff
Next
于 2008-10-06T18:08:21.623 に答える
5

変数に明示的に Nothing を代入する必要はほとんどありません。ガベージ コレクターの仕事は、ユーザーに代わってメモリの割り当てを処理することです。具体的には、この責任を軽減することです。いいえ、a = Nothingループ内で割り当てる必要はありません。

try/finally全体に Nothing を割り当てるブロックも必要ありません。これは実際には、ランタイム システムが処理する余分な混乱です。

于 2008-10-06T18:05:21.053 に答える
2

いいえ、必要ありません。.NET にはガベージ コレクションがあります。このコードはメソッド スコープ内にあるように見えるため、ガベージ コレクションによってローカル変数がクリーンアップされます。

于 2008-10-06T18:04:18.950 に答える
0

上記のすべての人のように、変数は自動的に処理されるため、変数を明示的に何にも設定する必要はありません。ただし、何らかの理由でGCに強制的に収集させたい場合は、次のコマンドを実行できます。

System.GC.Collect()
于 2008-10-06T18:40:13.213 に答える
0

GCはそれをクリーンアップします。

于 2008-10-06T18:07:41.890 に答える