当我在Using(connection)的代码中返回时,连接和db对象是否被正确地驳回
本文关键字:db 连接 对象 是否 正确地 返回 Using connection 代码 | 更新日期: 2023-09-27 18:06:08
我不确定我的问题是否清楚,所以这里有一个代码示例:
public static bool isRecordExist(int ID)
{
using (SqlConnection connection = new SqlConnection(ConnectionString))
{
using (SqlCommand command = new SqlCommand(commandText, connection))
{
int flag = int.Parse(command.ExecuteScalar);
if (flag)
return false;
else
return true;
}
}
}
所以,现在我明白,当我有'using'关键字时,我不需要关闭或驳回任何Sql对象,因为一旦你得到我们的括号,它就会自动这样做,但现在我们到达'返回'部分。它是否会正确地解散并关闭对象,或者我是否需要保存此值并在'using'代码之外进行检查和'return' ?
是自动关闭。退出using块调用。dispose(),对于SqlConnection将关闭连接和所有打开的资源。
是,连接将被关闭。
注意,这可能会导致问题。例如,假设您希望从函数返回一个DataReader。一旦返回数据读取器,读取器所依赖的连接就会被using块关闭,您就不能读取任何记录。在这些情况下,我使用委托或迭代器块来解决问题,这取决于我在做什么。
是,对象将被正确处理。如果您查看一下从该方法生成的IL,您将在using { ... }
语句的适当位置看到一个try/finally块。从using { ... }
块内部的任何部分退出方法将始终遵循try/finally dispose模式。
我还建议你像这样使用语句:
using (SqlConnection connection = new SqlConnection(ConnectionString))
using (SqlCommand command = new SqlCommand(commandText, connection))
{
//some work
}
它通常使代码更具可读性,特别是当您使用其中的4或5个时。
是的,因为它是try/finally没有catch的语法糖。
所以当你这样做的时候:
using (SqlConnection connection = new SqlConnection ...) {
code code code then return;}
你在幕后得到(大致)这个:
SqlConnection connection;
connection = null;
try
{
connection = new SqlConnection ...;
code code code then return;
}
finally
{
if (connection != null) connection.dispose();
}
根据finally的定义,它总是被调用,无论你如何打破try块(通常你认为'exception',但也包括return)。