我通常是c#开发人员,但目前有一个VB.Net任务...
此If语句引起我一个问题
If Emp("Id") = 20 AndAlso (Emp("EmpType") = 2 OrElse Emp("EmpType") = 4) AndAlso IsDBNUll(Emp("Left")) = True Then
所以我有个人加入了这个If
语句,
因为它们的Left
在数据库中不为空,所以我不希望它们满足此If
语句,但是它们满足。
我认为这与AndAlso周围的括号有关,但无法解决。
我在这里出了什么问题?
答案 0 :(得分:0)
我认为是因为它的评估如下:
If
(Emp("Id") = 20 AndAlso (Emp("EmpType") = 2)
OrElse
(Emp("EmpType") = 4) AndAlso IsDBNUll(Emp("Left")) = True)
Then
您可以仅在前三个条件周围加上括号(假设如果EmpType为4,则您不希望ID等于20):
If (Emp("Id") = 20 AndAlso (Emp("EmpType") = 2 OrElse Emp("EmpType") = 4)) AndAlso IsDBNUll(Emp("Left")) = True Then
但是,我建议将其重构为多个if,以使其更具可读性...
If IsDBNUll(Emp("Left")) Then
If (Emp("EmpType") = 4) OrElse _
(Emp("EmpType") = 2 AndAlso Emp("Id") = 20) Then
End if
End If
答案 1 :(得分:0)
让我重写条件以便于分析:
If Emp("Id") = 20 AndAlso (
Emp("EmpType") = 2 OrElse
Emp("EmpType") = 4
) AndAlso
IsDBNUll(Emp("Left")) = True Then
您在这里有短路运算符,可能无法评估第二个表达式:
OrElse
中,如果满足第一个条件,则不计算第二个表达式。AndAlso
中,如果不满足第一个条件,则不计算第二个表达式。如果Left
在db中不为空,则IsDBNUll(Emp("Left")) = True
将求值为False
,整个条件将失败。没有别的办法了。
如果先前的条件之一失败,它甚至可能不会执行。
因此,您有其他疑虑以外的问题。