2016-04-13 1 views
0

を配置することがnullの割り当てで、誰もがが可変のリリースメモリを強制したりvaraible

  1. を教えてくださいすることができ、使用後の変数にnullを割り当てることの利点は何ですか?
  2. オブジェクトを廃棄した後にnullを割り当てる意味はなんですか?
  3. GCはどのように機能しますか?

事前のおかげ

+1

質問3は非常に幅広く、質問1と2は本当に答えが十分ではありません。値nullを変数に代入するだけです... –

+1

@RahulTripathiそうではありません:Dispose()を呼び出すと、アンマネージリソースを解放する必要がありますが、廃棄オブジェクトへのnull以外の参照を保持すると、オブジェクトはまだ使用されています。 (また、コードは、配置されたオブジェクトを使用しようとする可能性があります。通常は結果が悪いので、nullにすると少なくともnull参照例外が発生します)。 –

答えて

1
  1. オブジェクトへの参照が以前に割り当てられたことを削除変数にnull(C#の)またはNothing(VB)を割り当てます。オブジェクトへの参照がなくなると、ガベージコレクションの対象となります。つまり、占有するメモリをシステムに戻すことができます。

  2. 1.オブジェクトを破棄すると、オブジェクトが保持する管理対象リソースまたは非管理対象リソースがすべて解放されます。そのオブジェクトが占有するメモリは、これらの目的のためのリソースとはみなされません。

  3. GCの目的は、未使用のメモリをシステムに戻して再割り当てすることです。そのオブジェクトへの管理参照がもうない場合は、オブジェクトが占有しているメモリのみを再利用することができます。これは、もはやオブジェクトを使用しなくなった場合に長期にわたる変数を無効にすることが重要な理由です。メソッドが完了すると、スコープが失われるため、ローカル変数はほとんど存続するとはみなされません。長寿命の変数の良い例は、WinFormsアプリケーションのスタートアップフォームにあるフィールドです。このフィールドは、アプリケーションの全ライフタイムのほぼ範囲にとどまります。 また、オブジェクトが廃棄されている場合にのみ、使い捨てオブジェクトが占有していたメモリを再利用することもできます。そのため、処分をサポートしていれば、処分したオブジェクトを処分することが重要です。そうしないと、GCがオブジェクトを占有するメモリを再利用しようとすると、そのオブジェクトは占有できなくなります。最初にオブジェクトをファイナライズし、それを破棄し、後でメモリを再利用しようとする必要があります。

+1

ローカルのスタックを設定することは、 )変数をnullに設定すると、メソッドが返ってきても取り消されたときにスコープから外れるためです。 –

+0

@MatthewWatson、これは私が「長命の変数」を指定した理由です。それはローカルになる可能性がありますが、めったに存在しないので、ローカル変数とメンバ変数を区別すると便利です。 – jmcilhinney

+0

@MatthewWatson - ローカル参照は、メソッドで最後に読み込まれた変数を超えてオブジェクトを保持しません。オブジェクトは、それらを参照するメソッドが終了する前に(少なくともリリースモードでは)十分にクリーンアップすることができます。 –

関連する問題