Разница в объявлении IDisposable члена в использовании блока или при использовании объявления блока? - PullRequest
3 голосов
/ 25 марта 2010

У меня есть код ниже:

    using (SqlCommand command = new SqlCommand())
    {

        command.CommandType = System.Data.CommandType.StoredProcedure;
        command.Connection = new SqlConnection();
        command.CommandText = "";

        command.Parameters.Add(new SqlParameter("@ExperienceLevel", 3).Direction = System.Data.ParameterDirection.Input);

        SqlDataReader dataReader = command.ExecuteReader();
   }

Есть ли какое-либо функциональное влияние в объявлении SqlConnection, где я в настоящее время объявляю его, в отличие от вот так?:

using (SqlCommand command = new SqlCommand())
using (SqlConnection connection = new SqlConnection())

Спасибо

Ответы [ 4 ]

5 голосов
/ 25 марта 2010

Да, есть разница. Уничтожение SqlCommand не приводит к автоматическому удалению SqlConnection, с которым он связан. Вы можете пропустить соединения таким образом, и это будет мешать пулу соединений ADO.NET; если вы посмотрите на активность сервера базы данных во время выполнения этого кода, вы увидите, что новые соединения открываются, а не закрываются.

Вы всегда должны использовать вторую версию. Фактически, объект SqlConnection - это тот, который вам действительно нужен от до Dispose. Вы всегда должны утилизировать что-либо , которое реализует IDisposable, как можно скорее, но отказ от утилизации SqlConnection особенно опасен.

3 голосов
/ 25 марта 2010

Да, желательно использовать 2 с использованием блоков, по 1 на ресурс.

В этом случае вы можете использовать только 1, но оно должно быть вокруг Соединения, а не вокруг Команды.

Но вы действительно не хотите знать или заботиться о таких деталях. Если класс реализует интерфейс IDispsoable, используйте его экземпляры в блоке using() { }, если только для этого нет особой причины.

2 голосов
/ 25 марта 2010

Я использую следующий шаблон:

using(var connection = new SqlConnection("ConnectionName"))
using(var command = new SqlCommand())
{
   command.Connection = connection;
   // setup command
   var reader = command.ExecuteReader();
   // read from the reader
   reader.Close();
}
0 голосов
/ 25 марта 2010

Да, приведенный ниже код будет корректно распределять SqlConnection, а приведенный выше - нет. Блок using (реализованный внутри как try ... finally) обеспечивает удаление объекта независимо от того, как вы выходите из блока.

...