2011-08-09 5 views
1

私はアプリケーションをレビューしていますが、どちらがエラーを起こしやすいのでしょうか?どちらがエラーをスローする傾向がありますか?

Public Function ToBool(ByVal vsValue As String) As Boolean 

     If IsNothing(vsValue) OrElse vsValue = "" Then 
      Return False 
     End If 
     If UCase(vsValue) = "TRUE" Or vsValue = "1" Or UCase(vsValue) = "Y" Or UCase(vsValue) = "YES" Or UCase(vsValue) = "T" Then 
      Return True 
     Else 
      Return False 
     End If 
    End Function 

又は

Public Function ToBool(ByVal vsValue As String) As Boolean 

      If IsNothing(vsValue) OrElse vsValue = "" Then 
       Return False 

      ElseIf UCase(vsValue) = "TRUE" Or vsValue = "1" Or UCase(vsValue) = "Y" Or UCase(vsValue) = "YES" Or UCase(vsValue) = "T" Then 
       Return True 
      Else 
       Return False 
      End If 
     End Function 
+1

自分の関数を書くのではなく、単に 'CBool​​'を使うのはなぜですか? – JaredPar

+1

"T"、1などのようにTrueとみなされる別の値があるため、これらの値が割り当てられているかどうかをチェックしているため、Trueと見なされます。 – Tarik

+1

この質問に対する答えと無関係なコメントと同様に、上記のコードについていくつか考慮すべきです:1)文字列の大文字と小文字を実際に変更する代わりに、 'String.Equals(vsValue、" True "、true)変数。 2)上記のようにしたいのであれば、 'UCase'の結果をローカル変数に格納して、一度だけ行うようにします。3)VB固有の' UCase'関数を使うのではなく、 vsValue.ToUpper() ' –

答えて

2

2つのコード例は、意味的に同一であるように、より多くのエラーが発生しやすいものであるように違いはありません。コードが最初のIfブロックの本体に入ると、どちらの場合も関数を終了します。実行するコードがでない場合ブロックの先頭にあるIfブロックの本体も同じです。

1

最初のものは、vsValueが何もない場合、 でなければなりません。そうでなければ、それが何かであり、2番目のuCase値の基準がそこになければ、最後のelseに行きます。特定の状態が不足している場合はfalseを返します。

最後にプログラムを2つ追加する必要はありません。

+0

関数は、最初の 'If'を入力すると関数を終了します。実行される実際のステップでは、2つの間に違いはありません。 –

1

エラーが発生しやすいとは思っていません。 2つのifsの代わりにelseを使用しているので、2番目の方が少し良いかもしれません...

+0

可読性の面で「良い」とか? –

+1

パフォーマンス(ごくわずか)と読みやすさ。 – David

+1

どのようにパフォーマンスの観点から優れていますか? 2つの例は、意味的に同一です。私は可読性に同意するでしょうが、それはOPが尋ねたものではありません。 –

1

関数による観測:数値に変換されたブール値Trueを渡すと、評価されないため失敗します。次のように-1ない1.

When Visual Basic converts numeric data type values to Boolean, 0 becomes False and all other values become True

私が最初に偽側面を評価するこれに非常に類似した何かを書いた:

Public Shared Function ConvertBool(ByVal Value As String) As Boolean 
    If Value Is Nothing Then Return False 
    Select Case Value.ToUpper 
     Case "", "0", "N", "FALSE", "F" 'etc 
      Return False 
     Case Else 
      Return True 
    End Select 
End Function 
0

最終結果は、いずれの場合も同じことになるだろう。コードを少し読みやすくし、他のマッチを含むように展開するのが簡単な次のリファクタリング手法をお勧めしますか?

Public Function ToBool(ByVal vsValue As String) As Boolean 
    If Not String.IsNullOrEmpty(vsValue) Then 
    Dim value As Boolean = False 
    vsValue = vsValue.ToUpper() 
    value = value OrElse vsValue = "TRUE" 
    value = value OrElse vsValue = "1" 
    value = value OrElse vsValue = "Y" 
    value = value OrElse vsValue = "YES" 
    value = value OrElse vsValue = "T" 
    Return value 
    End If 
    Return False 
End If 

これは別の可能性です。

Public Function ToBool(ByVal vsValue As String) As Boolean 
    If Not String.IsNullOrEmpty(vsValue) Then 
    vsValue = vsValue.ToUpper() 
    Select Case vsValue 
     Case "TRUE": Return True 
     Case "1": Return True 
     Case "Y": Return True 
     Case "YES": Return True 
     Case "T": Return True 
    End Select 
    End If 
    Return False 
End If 

上記の例では、コンパイラはシーケンシャルルックアップを出力します。 case文の数が一定の閾値に達すると、Select構造全体がDictionary検索like what C# doesに変換される可能性があります。これが呼び出されると予想される関数であれば、両方の方法を試してどちらが速いのかを調べることができます。

関連する問題