DataReader em blocos using executam o “Close()” do DataReader? – c# ado.net
Pergunta:
Eu tenho uma pequena dúvida a respeito de DataReader’s dentro de blocos using. Se o o meu objeto DataReader estiver dentro de um bloco using, ele será fechado ao final desse bloco? Ou eu tenho que inserir o método Close()?
Segue exemplo de DataReader com o bloco using:
using(var dr = myCommand.ExecuteReader())
{
//...Código
}
Está certo, ou eu tenho que inserir um Close()?
using(var dr = myCommand.ExecuteReader())
{
//...Código
dr.Close()
}
Autor da pergunta Matheus Bessa
Resposta mgibsonbr:
Estou assumindo que você se refere ao
DbDataReader
ou uma de suas subclasses (ex.:SqlDataReader
), mas pode-se adaptar a resposta caso eu esteja engando.
Seu primeiro exemplo está correto, não há a necessidade de se inserir um Close()
.
A função do comando using
é garantir que todo IDisposable
seja corretamente finalizado ao terminar o bloco – normalmente, ou através de uma exceção. Isso significa que será chamado o método Dispose
do mesmo, se ele não for nulo é claro (i.e. se houver exceção durante sua criação, não há como finalizá-lo).
using(var dr = CriarDisposable()) {
// código
}
É equivalente a:
{
var dr = CriarDisposable();
try
{
// Código
}
finally
{
if (dr != null)
((IDisposable)dr).Dispose();
}
}
O DbDataReader
implementa a interface IDisposable
, e a documentação do seu método Dispose
diz:
Libera os recursos usados pelo
DbDataReader
e chamaClose
.
Ou seja, não é necessário chamar Close
manualmente, o próprio using
se encarrega disso pra você.
P.S. Se eu me enganei, e você se refere a outra classe chamada DataReader
, dê uma olhada na documentação se ela também implementa IDisposable
, e o que o método Dispose
faz.