3

私はC#.NETでプログラミングしています。例外をスローせずにクラス プロパティの設定手順を中止することは可能ですか?

これが私がやりたいことです...

public int RandomProperty
{
    set
    {
     DialogResult answer = new DialogResult();
     answer = MessageBox.Show("This process could take up to 5 min. Are you sure you want to continue?");
     if(answer = DialogResult.No) 
        CancelSet   // Can I do something similar here?
     else
     {
      ...Do set procedure
     }
    }
}

プロパティグリッドでこの値を設定しているため、(プロパティの代わりに) メソッドを使用できるとは思いません。

4

5 に答える 5

12

IMOは単に良いことではありません-スローされない場合、値が割り当てられることが期待されます。実行する前にsetUI (またはどこでも) でテストするか、例外をスローして処理します。別の方法として、次のメソッドを使用すると、呼び出し元混乱しにくくなる場合があります。set

public bool TrySetRandomProperty(SomeType value) {
    ...
}

trueまたは、それが発生したかどうかを示しますfalse。また、UI コードがドメイン ロジックに混入することも避ける必要があります。おそらくイベントを使用して、呼び出し元に特定の UI 実装を課すことなく、UI がユーザーと対話できるようにしますか?

于 2010-02-17T16:16:43.713 に答える
8

いかなる状況においても、これを行うべきではありません。プロパティは常に高速で、何かのプロパティを論理的に表す必要があります。理想的には、失敗しないはずです。UI のポップアップなどの副作用が発生することは絶対にありません。これらの重要なガイドラインのすべてに違反しています。やらないでください。

さらに、あなたのUIデザインは悪いです。「しばらく時間がかかるかもしれませんが、よろしいですか?」と事前にユーザーに尋ねないでください。はいをクリックすると、長い待ち時間で罰せられます。代わりに、操作を開始し、すぐに戻らない場合は、進行状況バーとキャンセル ボタンのある推定残り時間を表示する UI 要素をポップアップ表示します。

おそらく、長時間実行される操作は、別のスレッドで完全にキャンセルできる非同期メソッドとして記述する必要があります。

この種のことに対する優れたアーキテクチャは、「まだ実行中で、これがどのくらい進んでいるか」、または「今完了し、これが結果です」、または「操作をしようとしたときにエラーが発生しました。エラーの内容は次のとおりです」. そのオブジェクトは、ワーカー スレッドと通信して正常にシャットダウンする方法を認識している「キャンセル」メソッドを公開することもできます。このオブジェクトを取得するメソッドの呼び出し元は、UI をユーザーに表示する方法を決定できます。

このアーキテクチャを使用すると、UI ロジック、非同期ロジック、およびビジネス プロセス ロジックを互いに明確に分離できます。これは仕事ですが、後で配当を支払います。

于 2010-02-17T18:55:04.057 に答える
3

うーん。クラス プロパティ内にユーザー インターフェイスを組み込みますか? このチェックは、ユーザー インターフェイスでさらに行うべきではありませんか?

于 2010-02-17T16:17:15.557 に答える
2

確かにこの方法でコーディングできますが、フィールドを設定しないでください。

ただし、低レベルのコードに UI を混在させているため、非常に悪い設計になっています。

プロパティを設定する前に質問することは、1 つのオプションです。

于 2010-02-17T16:18:05.460 に答える
1

セットから戻るだけです。設定したい値を保持するにはプライベートフィールドを使用する必要がありますが、「キャンセル」で戻る必要があります。

于 2010-02-17T16:15:21.673 に答える