Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

VB.NET boolean doesn't get its default value in loop?

I have something like this:

For i = 1 To 4
        Dim x As Boolean
        If i < 3 Then x = True
        Console.WriteLine(x)
Next

Gives me: True True True True

and this

For i = 1 To 4
        Dim x As Boolean = False
        If i < 3 Then x = True
        Console.WriteLine(x)
Next

Gives me: True True False False

Aren't they both supposed to give me the second result? The MSDN article says that The default value of Boolean is False.

Is it a bug or am I missing something?

like image 479
gunakkoc Avatar asked Nov 26 '12 01:11

gunakkoc


People also ask

What is the default value for Boolean variable in VB net?

The default value of Boolean is False .

How do you set a Boolean to default?

Use the create() or update() methods to specify the value of the new property as its default value, that is, false for boolean or 0 for integer.

Can Boolean be null vb net?

A Boolean value can never be null ( Nothing ), the values that are possible are True and False .

What is the default size of Boolean datatype?

Boolean variables are stored as 16-bit (2-byte) numbers, but they can only be True or False.


1 Answers

Thank you for the very interesting question. I took the sample code:

Module Module1

    Sub Main()
        Test1()
        Test2()
        Console.ReadKey()
    End Sub

    Public Sub Test1()
        For i = 1 To 4
            Dim x As Boolean
            If i < 3 Then x = True
            Console.WriteLine(x)
        Next
    End Sub

    Public Sub Test2()
        For i = 1 To 4
            Dim x As Boolean = False
            If i < 3 Then x = True
            Console.WriteLine(x)
        Next
    End Sub
End Module

And took a look at the generated IL via ILSpy:

Test1()

    .method public static 
        void Test1 () cil managed 
    {
        // Method begins at RVA 0x2120
        // Code size 33 (0x21)
        .maxstack 2
        .locals init (
            [0] int32 i,
            [1] bool x,
            [2] bool VB$CG$t_bool$S0,
            [3] int32 VB$CG$t_i4$S0
        )

        IL_0000: nop
        IL_0001: ldc.i4.1                   
        IL_0002: stloc.0                        // put 1 on top of stack
        // loop start (head: IL_0003)
            IL_0003: ldloc.0                    // load i on top of stack 
            IL_0004: ldc.i4.3                   // load 3 on top of stack
            IL_0005: clt                        // compare if 0 is less than 3
            IL_0007: stloc.2                 
            IL_0008: ldloc.2
            IL_0009: brfalse.s IL_000d          // if i >= 3, jump to IL_000d

            IL_000b: ldc.i4.1                   // load true onto stack
            IL_000c: stloc.1                    // set x = true

            IL_000d: ldloc.1                    // load x onto stack
            IL_000e: call void [mscorlib]System.Console::WriteLine(bool) // print x
            IL_0013: nop
            IL_0014: nop
            IL_0015: ldloc.0                    // load i onto stack
            IL_0016: ldc.i4.1                   // load 1 onto stack
            IL_0017: add.ovf                    // add i + 1
            IL_0018: stloc.0                    // set i = i + 1
            IL_0019: ldloc.0                    // load i
            IL_001a: ldc.i4.4                   // load 4
            IL_001b: stloc.3                    // store 4 in iterator variable
            IL_001c: ldloc.3                    // load 4 from iterator variable
            IL_001d: ble.s IL_0003              // if i <= 4, go to beginning of loop
        // end loop
        IL_001f: nop
        IL_0020: ret
    } // end of method Module1::Test1

Test2()

        .method public static 
        void Test2 () cil managed 
    {
        // Method begins at RVA 0x2150
        // Code size 35 (0x23)
        .maxstack 2
        .locals init (
            [0] int32 i,
            [1] bool x,
            [2] bool VB$CG$t_bool$S0,
            [3] int32 VB$CG$t_i4$S0
        )

        IL_0000: nop
        IL_0001: ldc.i4.1                   // load 1 onto stack
        IL_0002: stloc.0                    // set i = 1
        // loop start (head: IL_0003)       
            IL_0003: ldc.i4.0               // load 0 onto stack
            IL_0004: stloc.1                // set x = false
            IL_0005: ldloc.0                // load i onto stack
            IL_0006: ldc.i4.3               // load 3 onto stack
            IL_0007: clt                    // compare i to 3
            IL_0009: stloc.2                // store result in iterator variable
            IL_000a: ldloc.2                // load iterator variable
            IL_000b: brfalse.s IL_000f      // if i >= 3, jump to IL_00f

            IL_000d: ldc.i4.1               // load 1 onto stack
            IL_000e: stloc.1                // set x = true

            IL_000f: ldloc.1                // load x onto stack
            IL_0010: call void [mscorlib]System.Console::WriteLine(bool)    // print x
            IL_0015: nop            
            IL_0016: nop
            IL_0017: ldloc.0                // load i onto stack
            IL_0018: ldc.i4.1               // load 1 onto stack
            IL_0019: add.ovf                // add i + 1
            IL_001a: stloc.0                // set i = i + 1
            IL_001b: ldloc.0                // load i onto stack
            IL_001c: ldc.i4.4               // load 4 onto stack
            IL_001d: stloc.3                // store 4 into iterator variable
            IL_001e: ldloc.3                // load 4 from iterator variable
            IL_001f: ble.s IL_0003          // if i <= 4, go to beginning of loop
        // end loop
        IL_0021: nop
        IL_0022: ret
    } // end of method Module1::Test2

What this tells us is that even though you are declaring x in the loop (Dim x as Boolean) and (Dim x as boolean = False), the actual declaration of the variable happens outside the loop.

Because you give your variable a default value inside the loop in Test2, it is actually setting the value to False at the beginning of each iteration. Because you do not assign a value to x in the Test1 loop and it only gets declared once outside of the loop, it retains the value it had in the previous iteration.

like image 101
armen.shimoon Avatar answered Oct 29 '22 20:10

armen.shimoon