Вызов Connection.Close / Dispose в финализаторе - PullRequest
3 голосов
/ 08 июня 2011

Я всегда звонил Connection. Закройте в блоке finally, однако сегодня я узнал, что вы не должны этого делать :

Не вызывайте Close или Dispose для Connection, DataReader или любого другого управляемого объекта в методе Finalize вашего класса. В финализаторе вы должны освобождать только неуправляемые ресурсы, которыми непосредственно владеет ваш класс. Если ваш класс не владеет какими-либо неуправляемыми ресурсами, не включайте метод Finalize в определение класса

Таким образом, при понимании того, что удаление объекта SqlCommand не удаляет и не закрывает назначенный ему объект подключения, будет ли следующий (упрощенный код ниже) утилизировать объект команды и подключения одновременно? и мне действительно нужно вызывать Connection.Dispose, если я всегда вызываю Connection.Close?

Using cmd As New NpgsqlCommand(String.Empty, new connection())
    cmd.CommandText = "some sql command here"
    sqlCmd.Connection.Open()
    ...create and fill data table
    sqlCmd.Connection.Close()
End Using

Ответы [ 2 ]

5 голосов
/ 08 июня 2011

Нет, вам не нужно явно вызывать Close, если вы используете блок Using. Вот как бы я это написал:

Using conn As New SqlConnection("SOME CONNECTION STRING")
    Using cmd = conn.CreateCommand()
        conn.Open()
        cmd.CommandText = "some sql command here"

        ' ... create and fill data table
    End Using
End Using

Также вызов Close не закрывает соединение. ADO.NET использует пул соединений, поэтому вызов Close просто возвращает соединение в пул. Физически не закрывает соединение.

1 голос
/ 08 июня 2011

То, что вы делаете, прекрасно. Финализаторы отличаются от блоков наконец. Проверьте http://www.switchonthecode.com/tutorials/csharp-tutorial-object-finalizers для обсуждения того, что финализаторы.

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