使用块和Dispose方法之间的性能比较

时间:2015-04-16 12:55:11

标签: c# performance ado.net try-catch using-statement

考虑这两个片段:

方法1:使用using声明

using(var connection = new SqlConnection())
using(var command = new SqlCommand(cmdText, connection)){
    try{
        connection.Open();
        using(var reader = command.ExecuteReader(
            CommandBehavior.CloseConnection | CommandBehavior.SingleResult){
            while(reader.Read())
                // read values
        }
    } catch (Exception ex) { 
        // log(ex);
    }
}

方法2:使用try/finally

var connection = new SqlConnection();
var command = new SqlCommand(cmdText, connection);
SqlDataReader = null;
try{
    var reader = command.ExecuteReader(
        CommandBehavior.CloseConnection | CommandBehavior.SingleResult);
    while(reader.Read())
        // read values...
} catch (Exception ex) { 
    // log(ex);
} finally {
    command.Dispose();
    if (reader != null) {
        if (!reader.IsClosed)
            reader.Close();
        reader.Dispose();
    }
    if (connection.State != ConnectionState.Closed)
        connection.Close();
    connection.Dispose();
}

我们都知道using语句会被编译为try/finally块。所以说:当应用程序编译时,会有 4 try块吗?

try { // for using SqlConnection

    try { // for using SqlCommand

        try { // my own try block

            try { // for using SqlDataReader

            } finally { 
                // dispose SqlDataReader
            }

        } catch { 
            // my own catch. can be used for log etc.
        }

    } finally {
        // dispose SqlCommand
    }

} finally {
    // dispose SqlConnection
}

而且,如果答案是肯定的,那么这不是性能问题吗?通常,有没有,我的意思是using块和try/finally块之间的任何性能差异?

更新

从评论中,我可以说:

1-重要的问题是,彼此之间有多个try块:是否存在任何性能问题?

2-我必须关心代码,因为我负责编码,而不是查询。查询端有自己的开发人员正在尽力而为。所以,我也必须尽力而为。所以,照顾毫秒对我来说很重要;)在此先感谢。

1 个答案:

答案 0 :(得分:1)

通常当您听说try/catch很慢时,它都是关于异常处理的。因此,如果发生异常,那么它可能会很慢。但只需输入try方法就不应该担心。特别是在你扭曲SQL查询调用的情况下。

如果您想了解有关.NET中异常和性能的更多信息,可以找到很多要阅读的文章。例如:MSDN articlegreat CodeProject article

当然using是更好的方式,因为它使代码更清晰。