Возможный дубликат:
Будет ли использование блокировать закрытие соединения с базой данных?
Является ли db.Close()
ненужным в следующем?
using (DbConnection db = GetDbConnection())
{
// do data-access stuff
// ...
db.Close();
}
Возможный дубликат:
Будет ли использование блокировать закрытие соединения с базой данных?
Является ли db.Close()
ненужным в следующем?
using (DbConnection db = GetDbConnection())
{
// do data-access stuff
// ...
db.Close();
}
Нужно ли закрывать DbConnection, если используется предложение using?
Нет, нет необходимости закрывать DbConnection, если используется предложение использования?
и
Да, здесь это не нужно, потому что, когда область using
заканчивается, соединение будет располагаться, что означает закрытие и освобождение всей памяти.
Поскольку DBConnection
реализует интерфейс IDisposable
, функция закрытия есть в методе Dispose
DBConnection
.
Но если некоторые строки находятся после закрытия строки, это полезно
using (DbConnection db = GetDbConnection())
{
// do data-access stuff
// ...
db.Close(); //Useless
}
Но тут пригодится
using (DbConnection db = GetDbConnection())
{
// do data-access stuff
// ...
db.Close(); //Useful
// Some more code
}
В этом случае вы можете сделать
using (DbConnection db = GetDbConnection())
{
// do data-access stuff
// ...
}
// Some more code which was previously inside using section.
using
.
- person Myrtle; 20.08.2012
db.Close();
, полезно закрыть его вручную.
- person Nikhil Agrawal; 20.08.2012
Просто чтобы убедиться, что я проверил код :)
protected override void Dispose(bool disposing)
{
if (disposing)
{
this._userConnectionOptions = (DbConnectionOptions) null;
this._poolGroup = (DbConnectionPoolGroup) null;
this.Close();
}
this.DisposeMe(disposing);
base.Dispose(disposing);
}
Это реализация SqlConnection, которая наследуется от DbConnection. Как видите, есть метод this.Close() :)
using
вызывает Dispose()
или Dispose(bool disposing)
- person cuongle; 20.08.2012
Dispose()
, который является общедоступным. Затем его реализация вызовет Dispose(true)
.
- person Myrtle; 20.08.2012
Насколько я знаю, когда вызывается метод Dispose()
, автоматически выполняется Close()
.
Так что db.Close();
здесь не нужен.
В закрывающей фигурной скобке вызывается Dispose()
.
Я думаю, что в методе DbConnection
метод Dispose
также будет проверять, закрыто ли соединение. Так что нет, вероятно, в этом нет необходимости, но я лично считаю, что это хорошая практика, которая улучшает читаемость и не влияет на производительность, потому что Close
будет вызываться так или иначе.
Извлеченный код из реализации dispose класса SqlConnection
(Производный от DbConnection
):
public void Dispose()
{
Dispose(true);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
this.Close();
}
base.Dispose(disposing);
}
Ключевое слово using
использует интерфейс IDisposable
. Метод выше является реализацией метода. Это закроет соединение.