Estoy tratando de probar esta pieza de código colocando puntos de interrupción. Quiero asegurarme de que después de usar el bloque, se llame al método de disposición y se liberen los recursos (SqlCommand). ¿Sin embargo, en ninguna parte del bloque de uso he tocado ninguna disposición?

    using (SqlCommand command = new SqlCommand(queryString, connection))
{
    command.CommandType = CommandType.Text;
    command.Parameters.Add("@OrganizationID", SqlDbType.Int);
    command.Parameters["@OrganizationID"].Value = organizationId;
    connection.Open();
    SqlDataReader sqlDataReader = command.ExecuteReader(CommandBehavior.CloseConnection);

    try
    {
        while (sqlDataReader.Read())
        {
            //do something 
        }
    }
    finally
    {
        sqlDataReader.Close();
    }
}
2
imba22 29 ago. 2016 a las 20:51

2 respuestas

La mejor respuesta

La instrucción using garantiza que se llame a Dispose incluso si se produce una excepción mientras llama a métodos en el objeto. Puede lograr el mismo resultado colocando el objeto dentro de un bloque try y luego llamando a Dispose en un bloque finalmente; de hecho, así es como el compilador traduce la declaración using. El ejemplo de código anterior se expande al siguiente código en tiempo de compilación (tenga en cuenta las llaves adicionales para crear el alcance limitado del objeto):

La parte clave es "lograr el mismo resultado colocando el objeto dentro de un bloque try y llamando finalmente".

SqlCommand command = new SqlCommand(queryString, connection);
try {

      // your code here
} finally {

      command.Dispose();
}

De MSDN

3
dckuehn 29 ago. 2016 a las 17:54

La llamada a Dispose de IDisposable ocurre después de que el bloque using ha terminado de ejecutarse, normal o anormalmente (es decir, a través de una excepción).

La única forma en que podría capturar la llamada en un depurador de nivel de fuente es cuando tiene el código fuente para su IDisposable; en su caso, sería el código fuente de la clase SqlCommand.

Una forma sencilla de comprobar cómo funciona esto es hacer su propia implementación de IDisposable, ponerla en un bloque using y observar su comportamiento. La llamada a Dispose debería seguir inmediatamente después de completar el bloque using.

5
Sergey Kalinichenko 29 ago. 2016 a las 17:54