我正在审核一个应用程序,我想知道哪一个更容易出错?
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
答案 0 :(得分:2)
哪一个更容易出错,没有区别,因为两个代码示例在语义上是相同的。如果代码进入第一个If
块的主体,那么在两种情况下它都将退出该函数。如果不进入第一个If
块的主体,则执行的代码也是相同的。
答案 1 :(得分:1)
第一个,因为如果vsValue什么都没有,你将无法完成所有事情, 否则,如果它是某些东西并且第二个uCase值的标准不存在,那么它将进入最终的其他。当你可能只是错过一个特定的状态时,这将返回false。
它只是使得程序不需要经过两个额外的if if。
答案 2 :(得分:1)
我相信没有一个更容易出错。第二个可能会好一点,因为它使用else而不是2 ifs ...
答案 3 :(得分:1)
使用函数进行观察:如果传入一个已转换为整数的布尔True
值,它将失败,因为它的计算结果为-1而不是1。
我写了一些与此非常相似的内容,首先评估了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。如果这是您期望被调用的函数,那么您可以尝试两种方法来查看哪一种更快。