10

クラスが破棄されているときに、いくつかの通信ポートを適切に閉じたい C# のクラスがあります。ただし、プログラムを終了するときにファイナライザーが呼び出されることはありません。何故ですか?私は何か間違ったことをしていますか?

すべての通信を通過して閉じる手動で破棄を呼び出しています。これも解雇されません。

私が使用しているファイナライザーは次のとおりです。

~Power()
{
    Dispose(false);
}
4

3 に答える 3

11

ファイナライザー (ここで使用しているもの) は、GC 中に発生するファイナライズ フェーズでのみ呼び出されます。

IDisposable を正しく実装すると、これが呼び出されることはありません。これについては、 IDisposableに関する私のシリーズで詳しく説明します。

そうは言っても、「通信ポート」がマネージド クラスを介して処理される場合は、ファイナライザーをまったく使用しないでください。これは、まったく役に立たないオーバーヘッドを追加しています。IDisposable を (適切に) 実装するだけで、必要に応じて、ポート クラスのマネージ ラッパーでファイナライズを処理できます。

于 2011-03-05T00:55:36.750 に答える
7

周りに誰もいない森で木が倒れたら、音はしますか?次のことを確認してください。

using System;

class Program {
    static void Main(string[] args) {
        new Test();
    }
}

class Test {
    ~Test() { Console.Beep(); }
}

プログラムの終了時に残されたオブジェクトのファイナライザーは、プロセスが終了する直前に呼び出されます。これが起こらない唯一の方法は、プロセスが無礼に中止された場合です。たとえば、 Environment.FailFast() 。

于 2011-03-05T01:26:51.183 に答える
0

ファイナライザーはガベージ コレクターによって呼び出され、ガベージ コレクションは予測可能なプロセスではないため、信頼性が高くありません。リソースを処分する他の手段を見つける必要があります。

于 2011-03-05T00:55:35.083 に答える