1

コンストラクターで隠しファイルを作成し、呼び出されるFileStreamまで開いたままにするクラスがありますDispose()。を呼び出すDispose()と、ストリームが閉じられ、隠しファイルが削除されます。

を呼び出さずにプログラムを閉じた場合、ファイルが削除されていることを確認する必要がありますDispose()。まだ存在するかどうかを確認し、デストラクタに存在する場合は呼び出すことができると思っFile.Delete(path)ていましたが、ファイル パスを保持する文字列フィールドは、デストラクタが呼び出されたときに既に収集されていますよね?

デストラクタからそのフィールドにアクセスする安全な方法はありますか?
そうでない場合、ファイルが削除されていることを確認する別の方法はありますか?

4

3 に答える 3

2

しかし、ファイル パスを保持する文字列フィールドは、デストラクタが呼び出されたときに既に収集されていますよね?

いいえ、その文字列は引き続き存在し、安全に使用できます。

ただし、ファイルがまだ開いている場合は、最初にファイルを閉じて、慎重に操作する必要があります。

Dispose() を呼び出さずにプログラムを閉じた場合、ファイルが削除されていることを確認する必要があります。

それが大きな課題です。ここでの保証はあまりありません。クライアント コードが常にDispose() を呼び出すようにしてください。

于 2012-10-15T13:24:37.403 に答える
1

Finalize()使用しているクラスのメソッドを単純にオーバーライドできると思います。このMSDNの記事に従って:

デストラクタは、オブジェクトの基本クラスで Finalize を暗黙的に呼び出します。したがって、前のデストラクタ コードは暗黙的に次のコードに変換されます。

protected override void Finalize()
{
    try
    {
        // Cleanup statements...
    }
    finally
    {
        base.Finalize();
    }
}

メソッドで作業する場合Finalize()、フィールドがまだ「収集」されていないことも保証されるため、オブジェクトのすべてのフィールドを安全に使用できます。

于 2012-10-15T13:24:26.817 に答える
0

プロセスがクラッシュまたは強制終了された場合、Dispose() メソッドは呼び出されません。ファイルが存在するかどうかを確認するのではなく、特定のファイルが他のプロセスによってロックされているかどうかをテストする必要があります

于 2012-10-15T13:28:13.743 に答える