This is a followup question to this
Should I stick with the Try/Catch/Finally construct, or go with the Using construct?
Sample Code for Try/Catch/Finally:
Dim oRequest As WebRequest
Dim oResponse As HttpWebResponse = Nothing
Dim dataStream As Stream = Nothing
Dim reader As StreamReader = Nothing
Dim responseFromServer As String
Try
sNewCustomerURL = NewCustomerQueryStringPrepare()
'make the call to the webservice to add a new customer
oRequest = WebRequest.Create(sNewCustomerURL)
oRequest = CType(oRequesC, HttpWebRequest)
oRequest.Method = "GET"
oResponse = CType(oRequest.GetResponse(), HttpWebResponse)
dataStream = oResponse.GetResponseStream()
reader = New StreamReader(dataStream)
responseFromServer = reader.ReadToEnd()
Dim xml As New XmlDocument()
xml.LoadXml(responseFromServer)
Dim node As XmlNodeList = xml.GetElementsByTagName("SUCCESS")
Dim value = CBool(node(0).InnerText)
'do stuff
Catch ex As Exception
'process exception
Finally
'do cleanup
oRequest = Nothing
If Not oResponse Is Nothing Then
oResponse.Close()
End If
oResponse = Nothing
If Not reader Is Nothing Then
reader.Close()
End If
reader = Nothing
If Not dataStream Is Nothing Then
dataStream.Flush()
dataStream.Close()
End If
dataStream = Nothing
End Try
I know what the code would need to be for the Using construct. I just want to know if using the Using construct would be faster comparing clock cycles.
There won’t be a performance difference.
usingis expanded by the compiler to a try/finally block.You will see that the following two methods compile to identical IL.
The IL generated in the first case is:
.method private hidebysig instance void SampleWithUsing() cil managed { // Code size 26 (0x1a) .maxstack 2 .locals init ([0] class [mscorlib]System.IO.MemoryStream s) IL_0000: newobj instance void [mscorlib]System.IO.MemoryStream::.ctor() IL_0005: stloc.0 .try { IL_0006: ldloc.0 IL_0007: ldc.i4.1 IL_0008: callvirt instance void [mscorlib]System.IO.Stream::WriteByte(uint8) IL_000d: leave.s IL_0019 } // end .try finally { IL_000f: ldloc.0 IL_0010: brfalse.s IL_0018 IL_0012: ldloc.0 IL_0013: callvirt instance void [mscorlib]System.IDisposable::Dispose() IL_0018: endfinally } // end handler IL_0019: ret } // end of method Program::SampleWithUsingIn the second case with a try/finally in C# we get:
.method private hidebysig instance void SampleWithTryFinally() cil managed { // Code size 26 (0x1a) .maxstack 2 .locals init ([0] class [mscorlib]System.IO.MemoryStream s) IL_0000: newobj instance void [mscorlib]System.IO.MemoryStream::.ctor() IL_0005: stloc.0 .try { IL_0006: ldloc.0 IL_0007: ldc.i4.1 IL_0008: callvirt instance void [mscorlib]System.IO.Stream::WriteByte(uint8) IL_000d: leave.s IL_0019 } // end .try finally { IL_000f: ldloc.0 IL_0010: brfalse.s IL_0018 IL_0012: ldloc.0 IL_0013: callvirt instance void [mscorlib]System.IO.Stream::Dispose() IL_0018: endfinally } // end handler IL_0019: ret } // end of method Program::SampleWithTryFinally