使用倍数“使用”,这会如何影响性能?

时间:2009-02-13 10:20:32

标签: c# clr

我不反对使用“使用”语句,但我想知道当我们在另一个中使用它时这会如何影响性能。

例如:

        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;
        }

4 个答案:

答案 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)也说过抛出的异常并不那么昂贵。

说来,显然你不应该使用控制流的例外。