Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用block和Dispose方法的性能比较_C#_Performance_Ado.net_Try Catch_Using Statement - Fatal编程技术网

C# 使用block和Dispose方法的性能比较

C# 使用block和Dispose方法的性能比较,c#,performance,ado.net,try-catch,using-statement,C#,Performance,Ado.net,Try Catch,Using Statement,想想这两个片段: 方法1:使用使用语句 using(var connection = new SqlConnection()) using(var command = new SqlCommand(cmdText, connection)){ try{ connection.Open(); using(var reader = command.ExecuteReader( CommandBehavior.CloseConnectio

想想这两个片段:

方法1:使用
使用
语句

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();
}
我们都知道使用语句的
将被编译成
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
}
如果答案是肯定的,那不是性能问题吗?一般来说,我的意思是
使用
块和
尝试/最终
块之间是否有任何性能差异

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
}
更新:

从评论中,我不得不说:

1-重要的问题是,在彼此内部有多个
try
块:是否存在性能问题


2-我必须关心代码,因为我负责代码,而不是查询。查询端有自己的开发人员,他们正在竭尽全力。所以,我也必须尽我最大的努力。所以,对我来说,关注毫秒是很重要的;)提前感谢。

通常,当您听说
try/catch
很慢时,都是关于异常处理的。所以,若发生异常,那个么它可能会很慢。但只要输入
try
方法就不必担心了。特别是在扭曲SQL查询调用时

如果您想更多地了解.NET中的异常和性能,您可以找到许多文章阅读。例如:或


当然,
使用
是更好的方法,因为它使代码更干净。

您真的发现了性能问题吗?我不相信
使用
代码块会导致性能问题,并且更倾向于认为您的查询执行缓慢。4
尝试/最后
-是。性能问题-没有。你为什么问这个问题?使用
使用
可以使代码干净。使用
using
。如果您考虑的是该性能级别,则根本不应该使用托管代码。与其考虑使用
对性能的影响,不如考虑查询的性能。您的查询可能会运行数小时,但您正在通过混淆代码来优化毫秒。强制性
通常,当您在这里谈论try/catch时速度很慢,这都是关于异常处理的问题。我喜欢+1