2012-02-28 6 views
0

私は値に対していくつかのブールチェックを行っています。私は値のANYをチェックして、falseを返して何かをしたいと思っていました。Try Catchを使用してブール値を検索する

私がフォローを試みた:

bool formIsValid = true; 

try{ 

    Utility.testStringHasValue(txEmail.Text); <--- true 
    Utility.testStringHasValue(txFirstName.Text); <--- true 
    Utility.testStringHasValue(txLastName.Text); <--- FALSE 
    Utility.testStringHasValue(txUserEmployer.Text); <--- true 
    Utility.testStringHasValue(txUserPassword.Text); <--- true 
    Utility.testStringHasValue(txUserPassword2.Text); <--- true 
} 
catch (Exception) 
{ 
    formIsValid = false 
} 

..他のソリューションをこの1つは全くないと!

UPDATE

私は完全にキャッチし、使用/試してみてください削除:

bool isFormValid = Utility.testStringHasValue(txEmail.Text) 
       && Utility.testStringHasValue(txFirstName.Text) 
       && Utility.testStringHasValue(txLastName.Text) 
       && Utility.testStringHasValue(txUserEmployer.Text) 
       && Utility.testStringHasValue(txUserPassword.Text) 
       && Utility.testStringHasValue(txUserPassword2.Text) 
       && (txUserPassword.Text == txUserPassword2.Text); 
+6

例外処理のための素晴らしいケースではありません。 – Robaticus

+0

'Utility.testStringHasValue'とは何ですか? –

+0

ここでtry/catchは基本的にラベルなしのgotoとして動作します:( – asawyer

答えて

2

あなたはユーティリティメソッドを書いた場合、私はそれが文字列値を持っているかどうかを示すブール値を返す場合は特に、それが例外をスローしませんを確認することを示唆しています。

次のようにすれば、try { } catch { }は完全に回避できます。

bool formIsValid = Utility.testStringHasValue(txEmail.Text); <--- true 
        && Utility.testStringHasValue(txFirstName.Text); <--- true 
        && Utility.testStringHasValue(txLastName.Text); <--- FALSE 
        && Utility.testStringHasValue(txUserEmployer.Text); <--- true 
        && Utility.testStringHasValue(txUserPassword.Text); <--- true 
        && Utility.testStringHasValue(txUserPassword2.Text); <--- true 

&&は左側がtrueを返さない限り、右サイドを評価呼び出しませんので、Utility.testStringHasValueだけで、実際にあなたの例では3回呼び出されます。

0
if (Utility.testStringHasValue(txEmail.Text) && 
    Utility.testStringHasValue(txFirstName.Text) && 
    Utility.testStringHasValue(txLastName.Text) && 
    Utility.testStringHasValue(txUserEmployer.Text) && 
    Utility.testStringHasValue(txUserPassword.Text) && 
    Utility.testStringHasValue(txUserPassword2.Text) 
) { 
    all_good = true; 
} else { 
    no_so_good = true; 
} 

例外処理は、制御ロジックとして使用すべきではありません。それは目的を難読化する。

0

戻り値falseが例外をスローしないためです。あなたは、常に行うことができます。例外はパフォーマンスヒットがあるスローされたときに

if (!(
    Utility.testStringHasValue(txEmail.Text) && 
    Utility.testStringHasValue(txFirstName.Text) && 
    Utility.testStringHasValue(txLastName.Text) && 
    Utility.testStringHasValue(txUserEmployer.Text) && 
    Utility.testStringHasValue(txUserPassword.Text) && 
    Utility.testStringHasValue(txUserPassword2.Text))) 
{ 
    throw new Exception("Something is false"); 
} 
0
if (!(condtion1 && condition2 && .... && conditionN)) 
{ 
    // first condition evaluating to false gets you here 
    // anything afterwards is not checked. 
} 
4

いけない、そのシナリオのための例外を使用しています。

文字列が入力されているかどうかを確認するためにすでに利用可能な方法(String.IsNullOrEmpty)

は、あなたはすべてのフィールドが有効である検証する& &(と)演算子を使用することができますもあります。

例:

bool isValid = !String.IsNullOrEmpty(txtEmail.Text) && !String.IsNullOrEmpty(txtFirstname.Text) && !String.IsNullOrEmpty(txtLastName.Text); 

また、あなたがを使用してそれを他の方法を反転でき||(または)オペレーター

bool isInvalid = String.IsNullOrEmpty(txtEmail.Text) || String.IsNullOrEmpty(txtFirstname.Text) || String.IsNullOrEmpty(txtLastName.Text); 
0

Utility.testStringHasValue()をfalseに戻すには、例外をスローしないでください。 次へ

​​
0

testStringHasValueは何を返しますか?ブール値の場合は、代わりに次のようにすべての結合戻り値を使用します。

boolean result = true; 
result = result && Utility.testStringHasValue(txEmail.Text); 
result = result && Utility.testStringHasValue(txFirstName.Text); 
return result; 

例外を使用する方法はあまり良くありません。この種の検証には使用すべきではなく、キャッチに到達するという意図は、ブール値のfalse値を返すため、実際にonylではない例外をスローする場合にのみ有効です。

0

try..catch例外処理は、リソース単位の単純なブールチェックよりも高価です。 msdnサイトから:try..catch: "実行時に例外をキャッチするとオーバーヘッドが増え、例外を避けるために事前チェックよりも遅くなる可能性があります。" 前述のようにif..thenを使用します。

0

渡された値がすべて空でないことを確認するための再利用可能なメソッドの作成について考えましたか?あなたが複数の場所でコードを使用している場合は、このような何かが主要な時間の節約が考えられます。

using System.Linq; 

public static class Utility 
{ 
    public static bool EnsureValuesNotEmpty(params string[] values) 
    { 
     return values.All(value => !string.IsNullOrWhiteSpace(value)); 
    } 
} 

は、その後、あなたがはるかに少ないコードで機能を再使用することができますが、ちょうどあなたがチェックしたいすべての値を渡しますそれ:

var formIsValid = Utility.EnsureValuesNotEmpty(txEmail.Text, 
               txFirstName.Text, 
               txLastName.Text, 
               txUserEmployer.Text, 
               txUserPassword.Text, 
               txUserPassword2.Text); 
関連する問題