我不反对使用“使用”语句,但我想知道当我们在另一个中使用它时这会如何影响性能。
例如:
using (test1 (type1))
{
using (test2(type2))
{
using (test2(type3))
{
}
}
}
这将在IL中翻译成这样:
try
{
try
{
try
{
}
finally
{
}
}
finally
{
}
}
finally
{
}
这会增加程序集的大小,我相信会影响应用程序的性能,对吗?
我们不应该使用它吗?
type1 test1 = new type1;
type2 test2 = new type2;
type3 test3 = new type3;
try
{
}
finally
{
test1.Dispose;
test2.Dispose;
test3.Dispose;
}
答案 0 :(得分:25)
不,不使用您的第二张表格。如果test1.Dispose()
由于某种原因引发异常,则test2.Dispose()
和test3.Dispose()
将不会被调用。
性能差异(如果有的话)将是微观的。不要因为无关紧要的表现而丢掉正确性:)
答案 1 :(得分:6)
我认为您正在寻找以下内容:
using (test1(type1))
using (test2(type2))
using (test3(type3))
{
// Code using test1/test2/test3 goes here.
}
它相当于你问题中的第一个try-finally语句,虽然显然更具可读性。真的不要担心这里的表现;它是良好的设计实践和使用嵌套方法的强大功能(如前面的海报所指出的),另外还有易于理解的代码(多亏了多用语句)。
答案 2 :(得分:5)
我不认为担心程序集的大小是我们通常需要担心的,而代价是编写更复杂的维护代码!
您的示例代码完全显示为什么我们需要编译器生成它所执行的代码。如果您对 new type2()的调用失败,则永远不会调用 test1 上的 Dispose 方法,这会导致资源泄漏。
答案 3 :(得分:1)
除非抛出异常,否则try / catch / finally并不昂贵。即使这样,有几个人(包括Jon Skeet)也说过抛出的异常并不那么昂贵。
说来,显然你不应该使用控制流的例外。