考虑这两个片段:
方法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-我必须关心代码,因为我负责编码,而不是查询。查询端有自己的开发人员正在尽力而为。所以,我也必须尽力而为。所以,照顾毫秒对我来说很重要;)在此先感谢。
答案 0 :(得分:1)
通常当您听说try/catch
很慢时,它都是关于异常处理的。因此,如果发生异常,那么它可能会很慢。但只需输入try
方法就不应该担心。特别是在你扭曲SQL查询调用的情况下。
如果您想了解有关.NET中异常和性能的更多信息,可以找到很多要阅读的文章。例如:MSDN article或great CodeProject article。
当然using
是更好的方式,因为它使代码更清晰。