4

あまりにも長い間、私はガベージ コレクターにその魔法を任せ、自分自身からすべての責任を取り除きました。

悲しいことに、それが問題になることはありませんでした.

今考えてみると、「破棄」機能が実際に何をするのか、いつどのように実装する必要があるのか​​ よくわかりません。

ファイナライズの同じ質問...

そして最後の質問...私はクラスpictureManipulationを持っています:保存/サイズ変更/フォーマットの変更が必要なとき...私はそのクラスの新しいインスタンスを開始し、そのオブジェクトを使用します...まあ、ガベージコレクションにインスタンスを強制終了させます

class student
{
   public void displayStudentPic()
   {
      PictureManipulation pm = new PictureManipulation();
      this.studentPic = pm.loadStudentImage(id); 
   }
}

Class Test
{
  student a = new Student();
  a.displayStudentPic();
  // Now the function execution is ended... does the pm object is dead? Will the GC will kill it?
}
4

3 に答える 3

3

型が DB 接続、ファイル ハンドルなどのアンマネージ リソースを保持している場合、または型が保持しているオブジェクトの一部が IDisposable インターフェイスを実装している場合にのみ、Dispose メソッドを実装する必要があります。標準の Dispose パターンを実装する際に考慮すべき点がいくつかあります。

  • オブジェクトが IDisposable オブジェクトまたはアンマネージド リソース (DB 接続など) を保持していない場合は、IDisposable またはファイナライザーを実装する必要はまったくありません。
  • オブジェクトが IDisposable オブジェクトへの参照を保持している場合は、Dispose メソッドでこれらのオブジェクトに対して Dispose() を呼び出します。
  • オブジェクトが管理されていないリソースを保持せず、ファイナライザーを実装しない場合、ガベージ コレクターは、ファイナライザーを実装していない限り、オブジェクト (パフォーマンス ヒット) をファイナライズしようとしません。
  • オブジェクトがアンマネージ リソースを保持している場合は、Dispose(bool) メソッドのクリーンアップ コードを書き直すことなく、ファイナライザーでそれらをクリーンアップします。
于 2010-08-18T09:27:29.120 に答える
1

オブジェクト自体が保持するメモリ以外のリソースを保持している場合は、オブジェクトの破棄に注意する必要があります。

たとえば、オブジェクトがファイルを抽象化する場合、ファイルがリリースされるタイミングを制御する必要があります。そうしないと、非常にひどいことになります。アプリはファイルの使用を終了し、GCがオブジェクトを破棄するまでロックされたままになります。

それを正しく行う方法を知るには、disposeとfinalizeに関するマニュアルとusing(){}句を読んでください。

于 2010-08-18T09:15:53.800 に答える