IIf语句和If语句的评估方式不同。 IIf语句产生不正确的结果。为什么?

时间:2014-08-26 22:33:20

标签: asp.net vb.net if-statement iif

使用下面的代码,为什么 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

2 个答案:

答案 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