我有一个大型的经典ASP应用程序,我必须维护,我反复发现自己因缺乏短路评估能力而受挫。例如,VBScript不会让你逃脱:
if not isNull(Rs("myField")) and Rs("myField") <> 0 then
...
...因为如果Rs(“myField”)为null,则在第二个条件中出现错误,将null与0进行比较。所以我通常最终会这样做:
dim myField
if isNull(Rs("myField")) then
myField = 0
else
myField = Rs("myField")
end if
if myField <> 0 then
...
显然,冗长是非常可怕的。看看这个庞大的代码库,我发现最好的解决方法是使用原始程序员编写的一个函数,名为TernaryOp,它基本上采用三元运算符式功能,但我仍然坚持使用一个不会的临时变量在功能更全面的语言中是必要的。有没有更好的办法? VBScript中确实存在一些超级秘密的短路方法吗?
答案 0 :(得分:9)
嵌套的IF(仅略微冗长):
if not isNull(Rs("myField")) Then
if Rs("myField") <> 0 then
答案 1 :(得分:7)
也许不是最好的方式,但它确实有效......另外,如果你在vb6或.net中,你也可以使用不同的方法转换为正确的类型。
if cint( getVal( rs("blah"), "" ) )<> 0 then
'do something
end if
function getVal( v, replacementVal )
if v is nothing then
getVal = replacementVal
else
getVal = v
end if
end function
答案 2 :(得分:5)
我总是使用Select Case语句来简化VB中的逻辑。像...这样的东西。
Select Case True
Case isNull(Rs("myField"))
myField = 0
Case (Rs("myField") <> 0)
myField = Rs("myField")
Case Else
myField = -1
End Select
我的语法可能已关闭,已有一段时间了。如果第一个案例弹出,则忽略其他所有内容。
答案 3 :(得分:3)
或许我得到了问题的错误结束。你的意思是VB中的iIf()
吗?这对我有用:
myField = returnIf(isNothing(rs("myField")), 0, rs("myField"))
其中returnIf()
是这样的函数:
function returnIf(uExpression, uTrue, uFalse)
if (uExpression = true) then returnIf = uTrue else returnIf = uFalse : end if
end function
答案 4 :(得分:3)
如果您将其写成两个内联IF
语句,则可以实现短路:
if not isNull(Rs("myField")) then if Rs("myField") <> 0 then ...
但您的then
操作也必须出现在同一行。如果在then
之后需要多个语句,则可以将它们与:
分开,或将代码移动到可以调用的子例程。例如:
if not isNull(Rs("myField")) then if Rs("myField") <> 0 then x = 1 : y = 2
或者
if not isNull(Rs("myField")) then if Rs("myField") <> 0 then DoSomething(Rs("myField"))
答案 5 :(得分:1)
有没有,我的朋友--TernaryOp是你唯一的希望。
答案 6 :(得分:1)
是的,这不是最好的解决方案,但我们使用的是这样的
function ReplaceNull(s)
if IsNull(s) or s = "" then
ReplaceNull = " "
else
ReplaceNull = s
end if
end function
答案 7 :(得分:0)
有两种选择:
1)使用len()
或lenb()
来发现变量中是否有任何数据:
if not lenb(rs("myField"))=0 then...
2)使用返回布尔值的函数:
if not isNothing(rs("myField")) then...
其中isNothing()
是这样的函数:
function isNothing(vInput)
isNothing = false : vInput = trim(vInput)
if vartype(vInput)=0 or isEmpty(vInput) or isNull(vInput) or lenb(vInput)=0 then isNothing = true : end if
end function
答案 8 :(得分:0)
您可以使用Else
来捕捉空值,&#34;&#34;等等。
If UCase(Rs("myField")) = "THING" then
'Do Things
elseif UCase(Rs("myField")) = "STUFF" then
'Do Other Stuff
else
'Invalid data, such as a NULL, "", etc.
'Throw an error, do nothing, or default action
End If
我已经在我的代码中对此进行了测试,并且它目前正在运行。可能不适合每个人的情况。