Использование операторов и методов Close

Действительно ли оператор using вызывает метод close при использовании с объектом подключения к базе данных? В документации MSDN говорится, что он гарантирует, что метод Dispose вызывается, но не упоминает о закрытии. Я вижу сообщения о переполнении стека, где люди говорят, что они оба. Есть ли у кого-то конкретный ответ так или иначе по этому поводу от Microsoft или других твердых доказательств, что он делает?

Ответы

Ответ 1

Вот метод "Dispose" класса SqlConnection:

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        this._userConnectionOptions = null;
        this._poolGroup = null;
        this.Close();
    }
    this.DisposeMe(disposing);
    base.Dispose(disposing);
}

Как вы можете видеть, он действительно вызывает Close()

Ответ 2

Если вы используете оператор using, соединение будет закрыто, нет смысла, что объект, который реализует IDisposable, останется открытым после сбора мусора...

Но Close() и Dispose() - это не одно и то же:

  • Dispose() всегда вызывает Close() неявно.
  • Dispose() очищает ConnectionString, Close() не работает.
  • Если вы собираетесь снова открыть соединение, вы должны Close() not Dispose()

И если вы решите использовать Dispose(), не называйте его директивно, оператор using это лучший способ сделать это.

Ответ 3

Вызов метода Close вызовет Dispose. Не имеет значения, какой из них называется.

Конкретным примером является метод FileStream.Close():

Эта реализация Close вызывает метод Dispose, передающий истинное значение.

Ответ 4

Любой класс может иметь метод Dispose, если он реализует интерфейс IDisposable.

MSDN говорит: "Основное использование этого интерфейса - освобождение неуправляемых ресурсов".

Разработчику остается решить, что именно это означает.

В случае DBConnection удаление также означает закрытие соединения...

Ответ 5

Имейте ввиду, что все Close() делает это подключение обратно в пул соединений. Вы по-прежнему заметите активное подключение к базе данных в SQL Server. Если вам нужно убедиться, что это также закрыто, вы можете рассмотреть ClearAllPools или ClearPool

От MSDN Объединение пулов уменьшает количество раз, когда нужно открывать новые подключения. Пулёт поддерживает право собственности на физическое соединение. Он управляет соединениями, поддерживая живой набор активных соединений для каждой конкретной конфигурации соединения. Всякий раз, когда пользователь вызывает Open в соединении, пул пытается посмотреть, есть ли доступное соединение в пуле. Если объединенное соединение доступно, оно возвращает его вызывающему абоненту вместо открытия нового соединения. Когда приложение вызывает Close в соединении, пул возвращает его в объединенный набор активных соединений, а не фактически закрывает его. После того, как соединение будет возвращено в пул, он будет готов к повторному использованию при следующем открытом вызове.

Ответ 6

Закрыть и Dispose сделать то же самое. Они добавили Close просто для удобства чтения, так как говорят, что вы "Закрыли соединение" более естественно.