2

C# の一時的な場所にいくつかのファイルを書き込んでいます。それらは、pdf サムネイルとしてレンダリングされます。オブジェクトが破棄されたときに場所をクリーンアップしたいので、このインスタンスでデコンストラクターを使用しても問題ありませんか?

    ~Foo()
    {
        try
        {
            Directory.Delete(path, true);
        }
        catch (IOException ex)
        {
            Console.WriteLine("exception: " + ex.Message + " . from: Foo_Closing");
        }
4

8 に答える 8

7

C++ デストラクタと同じ構文を持っていますが、これはオブジェクトがファイナライズ時にガベージ コレクションされるときに実行される C# のファイナライザーです。これを行うには、GC が別のスレッドを実行してすべてのファイナライザーを実行する必要があるため、パフォーマンスに影響します。オブジェクト インスタンスは必要以上に長く存続します。

絶対に必要でない場合は使用しないでください - 例外は、リソースを破棄する必要がある場合です。その場合、クラスは も実装する必要がありますIDisposable。これにより、クラスのコンシューマーはそれをusingブロックにラップできるようになり、それが呼び出されます。これDispose()は、リソースを破棄する必要がある場所です。

于 2011-04-07T13:20:55.283 に答える
3

IDisposableインターフェイスを実装し、そこでクリーンアップを実行する必要があります。

于 2011-04-07T13:22:13.863 に答える
3

デストラクタ(別名デストラクタまたはファイナライザ)の問題は、ガベージコレクタによって呼び出されるため、いつ実行されるかを予測できないことです。予測可能な動作を実現するには、明示的に実装IDisposableして呼び出す必要がありますDispose(またはブロック内のオブジェクトを使用しますusing

Dispose明示的に呼び出されなかった場合は、デストラクタから呼び出すこともできます。使用する推奨パターンについては、このページを参照してください。

于 2011-04-07T13:22:33.297 に答える
2

通常のハウスキーピングプロセスの一部としてユーザーまたは管理者がファイルをクリーンアップできるように、環境の一時ファイル/フォルダーの場所を使用するだけです。

それはハックのスマックなので、これを気にしないでください-フォルダがそこで削除されることは本当に重要ですか?

于 2011-04-07T13:22:40.153 に答える
2

のファイナライザーの実装はできるだけ避けてください。それらがいつ呼び出されるかを制御することはできず、ランタイムがファイナライザーを使用してオブジェクトを特別に処理する必要があるため、パフォーマンスが低下します。一般に、クリーンアップが必要なネイティブ オブジェクト ハンドルまたはその他のネイティブ リソースがある場合にのみ、ファイナライザーを実装する必要があります。

代わりに、IDisposable インターフェイスをクラスに実装し、クリーンアップ コードを Dispose メソッドに移動し、すべてのクライアントが Dispose メソッドを呼び出すようにします (usingステートメントはこの目的に便利です)。

于 2011-04-07T13:23:35.483 に答える
2

代わりに IDisposable インターフェイスを実装します。

public class tester : IDisposable
{
    #region IDisposable Members

    public void Dispose()
    {
        //cleanup code here
    }

    #endregion
}

using (tester t = new tester())
{

}
//tester now disposed 

ただし、MSDN からのこの貴重な知識を忘れないでください。

Dispose メソッドは明示的に呼び出す必要があるため、IDisposable を実装するオブジェクトは、Dispose が呼び出されていないときにリソースの解放を処理するファイナライザーも実装する必要があります。

したがって、ファイナライザーと IDisposable インターフェイスも実装する必要があります。両方が呼び出されることに注意してください。

于 2011-04-07T13:23:36.783 に答える
1

代わりに IDisposable インターフェイスを使用しないのはなぜですか。その後、「using」で呼び出しをラップできます。Dispose() は、実行する必要があるすべてのクリーンアップを実行します。

public class Foo : IDisposable { public void Dispose() { //Clean up here}
}

using (foo = new Foo() ) { //consume foo here }

于 2011-04-07T13:24:46.510 に答える
0

閉じるときに一時ファイルを削除するオプションがありますが、それを活用できる場合は問題ありませんか? これらのリンクを試してください

  1. 一時ファイル ストリームでの処理
  2. http://msdn.microsoft.com/en-us/library/system.io.fileoptions.aspx
  3. http://www.codeproject.com/KB/system/Taking_care_of_temp_files.aspx?msg=3489384
于 2011-04-07T13:29:32.113 に答える