0

.NET では、プロパティを使用してイベントを使用し、イベントのキャンセルを許可するパターンがよくあります。たとえば、ここに例があります

    private void OtherInitialize() {
       this.Closing += new CancelEventHandler(this.Form1_Closing);
    }

    private void Form1_Closing(Object sender, CancelEventArgs e) {
       if (!isDataSaved) {
          e.Cancel = true;
          MessageBox.Show("You must save first.");
       }
       else {
          e.Cancel = false;
          MessageBox.Show("Goodbye.");
       }
    }

このパターンの名前、またはこのパターンの実装方法を (ビューの観点から) 説明する記事はありますか? 私が想像できるのは、このようなものです

CancelEventArgs args = new CancelEventArgs();
if(Closing != null)
    Closing(this, args);
if(!args.Cancel)
    DoActualClosing();

しかし、これが簡単かどうかはわかりません。複数のイベント ハンドラーがある場合、args.Cancel の最終的な値を決定するのはどのハンドラーでしょうか? ハンドラーの一部 (またはすべて) が例外をスローした場合はどうなりますか?

4

1 に答える 1

0

複数のイベント ハンドラーがある場合、args.Cancel の最終的な値を決定するのはどのハンドラーでしょうか?

各ハンドラが順番に呼び出され、args.Cancel を変更できます。

現在は追加された順に実行されていますが、これは保証されていない実装の詳細だと思います。

ということで、最後の方が勝ち。通常、Cancel イベント ハンドラーは arg.Cancel = true のみを設定する (決して false にリセットしない) ため、どのイベント ハンドラーでもアクションをキャンセルできます。しかし、イベント ハンドラーがその規則を無視するのを止める方法はありません。

ハンドラーの一部 (またはすべて) が例外をスローした場合はどうなりますか?

その後、それを処理しないと、アプリケーションは未処理の例外でクラッシュします。

あなたが想像する実装は正しいように見えます (スレッドセーフではありませんが、UI イベントは通常 UI スレッドでのみ処理されます)。このパターンの名前がわかりません。

于 2012-11-29T08:44:21.823 に答える