这是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构造是否会比较时钟周期更快。
答案 0 :(得分:9)
不会有性能差异。编译器将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
答案 1 :(得分:2)
using
汇编为try
/ catch
/ finally
。我真的看不出有任何语义或性能差异,只要你在手册try
/ catch
的情况下妥善处理你的对象。
在任何情况下,请使用using
,因为它会为您自动清理(实际上在finally
子句中)。即使存在性能差异,也可能是最小的,以便您有更好的优化位置。
答案 2 :(得分:0)
我必须相信使用与try / catch相比,相对于在这些构造中运行的代码而言,使用性能并没有任何差别。
答案 3 :(得分:0)
Try / Catch / Finally更快。
1)6.638秒:使用标签
2)6.265秒:尝试/捕捉/最后
我跑了十几次。 Try / Catch / Finally总是名列前茅。
DateTime start = DateTime.Now;
for (int i = 0; i < 50000000; i++)
{
using (MemoryStream s = new MemoryStream())
{
s.WriteByte(1);
}
}
Console.WriteLine(DateTime.Now.Subtract(start) + " seconds");
start = DateTime.Now;
for (int i = 0; i < 50000000; i++)
{
MemoryStream s = null;
try
{
s = new MemoryStream();
s.WriteByte(1);
}
catch { }
finally
{
if (s != null) s.Dispose();
}
}
Console.WriteLine(DateTime.Now.Subtract(start) + " seconds");