Когда я получаю возврат в коде Using (connection), соединение и объекты db удаляются должным образом - PullRequest
2 голосов
/ 19 августа 2011

Я не уверен, что мой вопрос понятен, поэтому вот пример кода:

    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;
            }
        }
    }

Итак, теперь я понимаю, что мне не нужно закрывать или закрывать какие-либо объекты Sql, когда у меня естьключевое слово «using», потому что оно делает это автоматически, как только вы получаете наши скобки, но теперь мы достигаем части «return».будет ли он закрывать и закрывать объекты должным образом или мне нужно сохранить это значение и выполнить проверку и «возврат» за пределами кода «using»?

Ответы [ 4 ]

4 голосов
/ 19 августа 2011

Да, он закрывается автоматически.Выход из блока using вызывает .Dispose () для рассматриваемого объекта, который для SqlConnection закроет соединение и любые открытые ресурсы.

Завершает ли использование закрытие открытого соединения SQL

2 голосов
/ 19 августа 2011

Да, объект будет расположен правильно. Если вы посмотрите на IL, сгенерированный методом, вы увидите блок try / finally в соответствующих местах ваших using { ... } операторов. Выход из метода из любой части блока using { ... } всегда будет следовать шаблону try / finally.

Я бы также рекомендовал составлять ваши операторы использования следующим образом:

using (SqlConnection connection = new SqlConnection(ConnectionString))
using (SqlCommand command = new SqlCommand(commandText, connection))
{
   //some work
}

Обычно это делает код более читабельным, особенно если вы используете 4 или 5 из них.

2 голосов
/ 19 августа 2011

Да, соединение будет закрыто.

Обратите внимание, что это может вызвать проблемы. Скажем, например, что вы хотите вернуть DataReader из функции. Как только вы вернете устройство чтения данных, соединение, от которого зависит ваш читатель, будет закрыто блоком using, и вы не сможете прочитать какие-либо записи. В этих ситуациях я использую либо делегат, либо блок итератора, чтобы обойти проблему, в зависимости от того, что я делаю.

1 голос
/ 19 августа 2011

Да, потому что это синтаксический сахар для попробовать / окончательно без улова .

Итак, когда вы делаете это:

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();
}

И по определению, наконец, он всегда вызывается, независимо от того, как вы выходите из блока try (обычно вы думаете «исключение», но также с учетом возврата).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...