使用下面的代码,为什么 iif 语句没有将permissionFlag设置为true,但是 if 语句呢?它们应该是完全相同的逻辑,我不明白。
我在下面写了一些代码来演示我的问题。将其复制并粘贴到后面的asp vb代码中,并设置代码中注释中注明的断点。我让这很容易复制。
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'' create a datatable: here is what the table will
'' consist of
'' col1 col2
'' 1 1
'' 2 1
'' 3 1
'' 4 1
Dim dt As New DataTable
dt.Columns.Add("col1")
dt.Columns.Add("col2")
Dim dr As DataRow
For i As Integer = 1 To 4
dr = dt.NewRow
dr(0) = i
dr(1) = 1
dt.Rows.Add(dr)
Next
Dim permissionFlag As Boolean = False
''loop through every row in the table we just created,
''and if the 2nd column is = 0 then the permissionFlag
''will be false, else the permissionFlag will be true
For Each drow As DataRow In dt.Rows
''check the 2nd column, this is a 1 if user has the permission
''but for some reason, permissionFlag still winds up false after
''this runs.
''***************** place breakpoint here to check value of
''***************** permissionFlag after each if statement
IIf(CInt(drow(1)) = 0, permissionFlag = False, permissionFlag = True)
''this next if statement is the same logic as the above, except
''the above iif statement is not working correctly, and this one is.
''permissionFlag is scwitched to true after this statement runs
''i don't know why, they both look correct to me.
If CInt(drow(1)) = 0 Then
permissionFlag = False
Else
permissionFlag = True
End If
Next
End Sub
答案 0 :(得分:4)
Iif
是一个带三个参数的函数。 If
是一个包含单独部分的声明。
致电时
IIf(CInt(drow(1)) = 0, permissionFlag = False, permissionFlag = True)
您实际上正在评估所有三个参数,因此您将permissionFlag设置为false,然后立即将其设置为true。
使用If
语句,VB.NET只执行一个或其他条件。
答案 1 :(得分:3)
基本上,您没有正确使用IIf。它不使用短路评估,因此两个表达式都被评估,意味着你的代码相当于
permissionFlag = False
permissionFlag = True
如果你想在这种情况下使用IIf,那么你需要将permissionFlag设置为返回的表达式的结果,例如
permissionFlag = IIf(CInt(drow(1)) = 0, False, True)
但是,它根本不是必需的,这是一个较短的方式
permissionFlag = CInt(drow(1)) != 0