クラスが破棄されているときに、いくつかの通信ポートを適切に閉じたい C# のクラスがあります。ただし、プログラムを終了するときにファイナライザーが呼び出されることはありません。何故ですか?私は何か間違ったことをしていますか?
すべての通信を通過して閉じる手動で破棄を呼び出しています。これも解雇されません。
私が使用しているファイナライザーは次のとおりです。
~Power()
{
Dispose(false);
}
ファイナライザー (ここで使用しているもの) は、GC 中に発生するファイナライズ フェーズでのみ呼び出されます。
IDisposable を正しく実装すると、これが呼び出されることはありません。これについては、 IDisposableに関する私のシリーズで詳しく説明します。
そうは言っても、「通信ポート」がマネージド クラスを介して処理される場合は、ファイナライザーをまったく使用しないでください。これは、まったく役に立たないオーバーヘッドを追加しています。IDisposable を (適切に) 実装するだけで、必要に応じて、ポート クラスのマネージ ラッパーでファイナライズを処理できます。
周りに誰もいない森で木が倒れたら、音はしますか?次のことを確認してください。
using System;
class Program {
static void Main(string[] args) {
new Test();
}
}
class Test {
~Test() { Console.Beep(); }
}
プログラムの終了時に残されたオブジェクトのファイナライザーは、プロセスが終了する直前に呼び出されます。これが起こらない唯一の方法は、プロセスが無礼に中止された場合です。たとえば、 Environment.FailFast() 。
ファイナライザーはガベージ コレクターによって呼び出され、ガベージ コレクションは予測可能なプロセスではないため、信頼性が高くありません。リソースを処分する他の手段を見つける必要があります。