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.
- ' 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.
- ' 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.
- 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.
- FileStream s1 = new FileStream("test1", FileMode.Create);
- try
- {
- }
- finally
- {
- bool flag = s1 != null;
- if (flag)
- {
- s1.Dispose();
- }
- }
And in VB.Net to this.
- 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 ;-).



LTD Social Sitings
Note: Watch for social icons on posts by your favorite authors to follow their postings on these and other social sites.