当我在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(connection)的代码中返回时,连接和db对象是否被正确地驳回

是自动关闭。退出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)。