关于asp.net:IIf语句和If语句的评估方式不同。

IIf statement and If statement evaluating differently. IIf statement yields incorrect results. Why?

使用下面的代码,为什么IIF语句不将PermissionFlag设置为true,而if语句设置为true?它们应该是同样精确的逻辑,我不明白。

我在下面写了一些代码来演示我的问题。复制并粘贴到后面的ASP VB代码中,并在代码的注释中设置断点。我让这个很容易复制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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


Iif是一个接受三个参数的函数。If是一个有独立部分的声明。

当你打电话

1
IIf(CInt(drow(1)) = 0, permissionFlag = False, permissionFlag = True)

实际上,您正在评估所有三个参数,所以您将permissionFlag设置为false,然后立即将其设置为true。

对于If语句,vb.net只执行一个或其他条件。


基本上,你在这里没有正确使用IIF。它不使用短路计算,因此对这两个表达式进行计算,这意味着您的代码等价于

1
2
permissionFlag = False
permissionFlag = True

如果要在这种情况下使用IIF,则需要将PermissionFlag设置为返回表达式的结果,例如。

1
permissionFlag = IIf(CInt(drow(1)) = 0, False, True)

不过,根本不需要,这条路比较短

1
permissionFlag = CInt(drow(1)) != 0