哪一个更倾向于抛出错误?

时间:2011-08-09 15:10:12

标签: vb.net

我正在审核一个应用程序,我想知道哪一个更容易出错?

    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

5 个答案:

答案 0 :(得分:2)

哪一个更容易出错,没有区别,因为两个代码示例在语义上是相同的。如果代码进入第一个If块的主体,那么在两种情况下它都将退出该函数。如果进入第一个If块的主体,则执行的代码也是相同的。

答案 1 :(得分:1)

第一个,因为如果vsValue什么都没有,你将无法完成所有事情, 否则,如果它是某些东西并且第二个uCase值的标准不存在,那么它将进入最终的其他。当你可能只是错过一个特定的状态时,这将返回false。

它只是使得程序不需要经过两个额外的if if。

答案 2 :(得分:1)

我相信没有一个更容易出错。第二个可能会好一点,因为它使用else而不是2 ifs ...

答案 3 :(得分:1)

使用函数进行观察:如果传入一个已转换为整数的布尔True值,它将失败,因为它的计算结果为-1而不是1。

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

我写了一些与此非常相似的内容,首先评估了False方面:

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

答案 4 :(得分: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

在上面的例子中,编译器将发出一个顺序查找。如果案例陈述的数量达到某个阈值,则可以将整个Select构造转换为Dictionary查找like what C# does。如果这是您期望被调用的函数,那么您可以尝试两种方法来查看哪一种更快。