这是
this的后续问题
我应该坚持使用Try / Catch / Finally构造,还是使用Using构造?
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
我知道Using构造需要什么代码.我只是想知道使用Using构造是否会比较时钟周期更快.
不会有性能差异. using由编译器扩展为try / finally块.
您将看到以下两种方法编译为相同的IL.
void SampleWithUsing() { using (MemoryStream s = new MemoryStream()) { s.WriteByte(1); } } void SampleWithTryFinally() { MemoryStream s = new MemoryStream(); try { s.WriteByte(1); } finally { if (s != null) s.Dispose(); } }
在第一种情况下生成的IL是:
.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::SampleWithUsing
在第二种情况下,在C#中使用try / finally,我们得到:
.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