Introduction

Yesterday there was a question on the VBIB forum on what the Using statement does and I answered it. But before going on I checked if I was right by looking at this MSDN article about Using.

And it states.

vb.net
1
2
3
4
5
6
7
8
9
10
' THE FOLLOWING TRY CONSTRUCTION IS EQUIVALENT TO THE USING BLOCK
Dim resource As New resourceType
Try 
    ' Insert code to work with resource.
Catch ex As Exception
    ' Insert code to process exception.
Finally 
    ' Insert code to do additional processing before disposing of resource.
    resource.Dispose() 
End Try 
' THE FOLLOWING TRY CONSTRUCTION IS EQUIVALENT TO THE USING BLOCK
Dim resource As New resourceType
Try 
    ' Insert code to work with resource.
Catch ex As Exception
    ' Insert code to process exception.
Finally 
    ' Insert code to do additional processing before disposing of resource.
    resource.Dispose() 
End Try 

That is the 2005 version of that article. The 2010 and 2012 version seem to have a different opinion.

vb.net
1
2
3
4
5
6
7
8
9
10
' For the acquisition and disposal of resource, the following
' Try construction is equivalent to the Using block.
Dim resource As New resourceType
Try 
    ' Insert code to work with resource.
Finally 
    If resource IsNot Nothing Then
        resource.Dispose() 
    End If
End Try 
' For the acquisition and disposal of resource, the following
' Try construction is equivalent to the Using block.
Dim resource As New resourceType
Try 
    ' Insert code to work with resource.
Finally 
    If resource IsNot Nothing Then
        resource.Dispose() 
    End If
End Try 

Another user of VBIB corrected this saying that there is no catch.

So I set out to check and downloaded Teleriks JustDecompiler.

TestData

First thing I did was to create a project. with this snippet in it.

vb.net
1
2
3
4
5
6
7
8
9
10
11
Imports System.IO
 
Module Module1
 
    Sub Main()
        Using s1 = New FileStream("test1", FileMode.Create)
 
        End Using
    End Sub
 
End Module
Imports System.IO

Module Module1

    Sub Main()
        Using s1 = New FileStream("test1", FileMode.Create)

        End Using
    End Sub

End Module

Decompilation

And I then decompiled that.

In IL that would look something like this.

IL_0000: nop
    IL_0001: nop
    IL_0002: ldstr "test1"
    IL_0007: ldc.i4.2
    IL_0008: newobj instance void [mscorlib]System.IO.FileStream::.ctor(string,  valuetype [mscorlib]System.IO.FileMode)
    IL_000d: stloc.2
    IL_000e: nop
    .try
    {
        IL_000f: nop
        IL_0010: leave.s IL_0028
    }
    finally
    {
        IL_0012: ldloc.2
        IL_0013: ldnull
        IL_0014: ceq
        IL_0016: ldc.i4.0
        IL_0017: ceq
        IL_0019: stloc.s VB$CG$t_bool$S0
        IL_001b: ldloc.s VB$CG$t_bool$S0
        IL_001d: brfalse.s IL_0026

        IL_001f: ldloc.2
        IL_0020: callvirt instance void [mscorlib]System.IDisposable::Dispose()
        IL_0025: nop

        IL_0026: nop
        IL_0027: endfinally
    }

and in C# that would recompile to this.

C#
1
2
3
4
5
6
7
8
9
10
11
12
    FileStream s1 = new FileStream("test1", FileMode.Create);
    try
    {
    }
    finally
    {
        bool flag = s1 != null;
        if (flag)
        {
            s1.Dispose();
        }
    }
    FileStream s1 = new FileStream("test1", FileMode.Create);
    try
    {
    }
    finally
    {
        bool flag = s1 != null;
        if (flag)
        {
            s1.Dispose();
        }
    }

And in VB.Net to this.

vb.net
1
2
3
4
Using s1 As FileStream = New FileStream("test1", FileMode.Create)
        If (s1 = Nothing) Then
        End If
    End Using
Using s1 As FileStream = New FileStream("test1", FileMode.Create)
        If (s1 = Nothing) Then
        End If
    End Using

I kinda think that the C# version of the decompilation is closer to the truth.

Conclusion

Did I get the wrong information from that MSDN article or was it different back in 2005? I have no idea. I just know that the 2010 and 2012 versions of that article are closer to the truth.

And don’t trust you decompiler to tell you the complete truth either ;-).