1

Window クラスのデストラクタで MessagBox.Show() を呼び出してみましたが、何もしませんでした。プログラムに 2 つの個別の Window クラスがあり、それぞれのデストラクタでこれを試しました。1 つのウィンドウを閉じてもう 1 つのウィンドウを開いたままにしても、閉じたウィンドウのデストラクタに MessageBox が表示されません。

2 つのデストラクタは次のようになります。

~MainWindow()
{
    MessageBox.Show("Exit Main Window", "Exit Main Window", MessageBoxButton.OK, MessageBoxImage.Information);
}
4

2 に答える 2

1

C# のファイナライザー (別名デストラクタ) は、たとえば C のデストラクタとは異なります。オブジェクト インスタンスの後にクリーンアップする場所ではありません。

代わりに、window オブジェクトのイベントを使用して、そのようなものをキャッチする必要があります。

インターフェイスを実装するオブジェクトではIDisposable、ファイナライザーは、オブジェクトが適切に破棄されていない場合にのみ実行されます。Disposeメソッドは通常、メソッドを使用してGC.SuppressFinalizeオブジェクトをファイナライザー キューから削除するため、通常、ファイナライザーはまったく呼び出されません。クリーンアップはDisposeメソッドによって行われます。

ファイナライザー呼び出される場合は、ガベージ コレクターによって実行される別のスレッドによって呼び出されます。これはアプリケーションのメイン スレッドではないため、ファイナライザーで GUI 関連の操作を行うことはできません。ファイナライザは、オブジェクトがガベージ コレクションされる直前に呼び出されるため、未使用になった直後ではなく、しばらくしてから呼び出されます。

また、オブジェクトが適切に破棄されていない場合でも、ファイナライザーが実行されるとは限りません。アプリケーションが閉じられると、ガベージ コレクターはしばらくの間、ファイナライザー キュー内のオブジェクトからファイナライザーを実行しますが、一定の時間が経過すると、ファイナライザーを呼び出さずにすべてのオブジェクトを放棄して強制終了します。

于 2013-04-29T17:56:59.783 に答える