1

日付のリストが含まれているコンボボックスがあります。ユーザーが実際に日付を選択するようにしたい。だから、私は次のものを持っています:

        if (cmbDateSelecter.SelectedItem.ToString().ToLower().Contains("select") || 
            cmbDateSelecter.SelectedItem.ToString().ToLower().Contains("seleccione") || 
            cmbDateSelecter.SelectedItem == null)

デフォルトの項目は「日付を選択」なので、それが選択された項目かどうかを確認しています。これは以前はそれ自体で機能していましたが、私がまだ理解していない何らかの理由で、NullReferenceExceptionsをスローし始めました。そこで、ヌルチェックを追加しました。ただし、まだ例外が発生しています。しかし、私がそうする場合:

if(cmbDateSelecter.SelectedItem == null)

今、私はnullチェックを最初に置くことができることを知っています、そしてすべてはハンキーなドーリーになります。私の質問は、例外をスローする前にすべての式を評価しないのはなぜですか?そして、それらの1つが真である場合、私の式(nullチェックである)の場合、なぜそれでも例外がスローされるのですか?

4

3 に答える 3

6

C#(および他のほとんどすべてのプログラミング言語)では論理OR演算子短絡評価を行うため、スローする前にすべての条件を評価するわけではありません。最初の2つの条件のいずれかを評価するには、nullオブジェクトにアクセスしようとする必要があるため、それらをすべて評価したとしても、スローされます。したがって、そのような動作は解決策を提供しません。

ただし、短絡評価はnull、最初にチェックを移動することで問題を修正できるようにするものです。テストが返さtrueれると、コンパイラは式全体が返されることを認識し、trueスローされる式の評価をスキップします。

于 2012-11-01T14:36:06.817 に答える
2

左から右に評価し、短絡評価を使用するため、次のものが必要です。

if (cmbDateSelecter.SelectedItem == null ||
    cmbDateSelecter.SelectedItem.ToString().ToLower().Contains("select") || 
    cmbDateSelecter.SelectedItem.ToString().ToLower().Contains("seleccione")
)

もう1つのポイントは、「選択してください」オプションを特定の文字列に依存しているため、テストが少し壊れやすいことです。これは間違いなく最初のオプションなので、代わりに次を使用できます。

if (cmbDateSelector.SelectedIndex <= 0)
{
    ... nothing selected ...
}
于 2012-11-01T14:37:10.490 に答える
1

ステートメントの括弧内のif式は、タイプの単なる通常の式boolです。条件のリストではありません。

ifあなたは間違った方法で声明を紹介されたようです。これは特殊なケースではありません。一般的なケースのインスタンスです。式を受け入れるC#のステートメントは、式を評価した結果を使用して何かを実行します。その他の例は次のとおりです。

  • return expression;-式の値を返します
  • while (expression) statement;式が残っている限り、ステートメントを実行しますtrue
  • do statement; while (expression);式がtrueである限りステートメントを実行しますが、式がで始まる場合でも、少なくとも1回は実行しfalseます。

これらと他の多くの共通点は、それらすべてが式を評価してその値を決定することです。式の評価中に例外がスローされた場合、式の評価はすぐに終了し、例外ハンドラーの検索が開始されます。

それはほとんどすべての現代のプログラミング言語で同じように機能するので、これはあなたの人生全体にとどまるレッスンです。

「短絡評価」のようなものでもこれは変わらないことに注意してください。

private bool NotGood(){throw new Exception();}

if (a || b)

これは最初にを評価しaます。trueの場合a、評価は停止します。aがfalseの場合にのみ、b評価されます。まだ、

if (NotGood() || b)

例外をスローし、評価することはありませんb


PS私は「条件付き」のセマンティクスが異なるシステムを使用してきました。特に、ルールエンジンやその他のそのようなシステムは、システムの動作の宣言型を処理します。このようなシステムは、条件のすべての部分を並行して評価したり、例外を値として、おそらくはとして処理したりする場合がありますfalse

于 2014-05-16T02:29:28.120 に答える