¿ADO.NET se va por la borda con IDisposable?

Cuando salió .NET por primera vez, fui uno de los muchos que se quejó de la falta de finalización determinista de .NET (los destructores de clases se llamaban en un horario impredecible). El compromiso que se le ocurrió a Microsoft en ese momento fue elusing declaración.

Aunque no es perfecto, creo que usarusing Es importante asegurar que los recursos no administrados se limpien de manera oportuna.

Sin embargo, estoy escribiendo un código ADO.NET y noté que casi todas las clases implementanIDisposable. Eso lleva a un código que se ve así.

using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand(query, connection))
using (SqlDataAdapter adapter = new SqlDataAdapter(command))
using (SqlCommandBuilder builder = new SqlCommandBuilder(adapter))
using (DataSet dataset = new DataSet())
{
    command.Parameters.AddWithValue("@FirstValue", 2);
    command.Parameters.AddWithValue("@SecondValue", 3);

    adapter.Fill(dataset);

    DataTable table = dataset.Tables[0];
    foreach (DataRow row in table.Rows) // search whole table
    {
        if ((int)row["Id"] == 4)
        {
            row["Value2"] = 12345;
        }
        else if ((int)row["Id"] == 5)
        {
            row.Delete();
        }
    }
    adapter.Update(table);
}

I fuertemente sospecho que no necesito todos esosusing declaraciones. Pero sin comprender el código para cada clase con cierto detalle, es difícil estar seguro de cuáles puedo omitir. Los resultados son un poco feos y restan valor a la lógica principal de mi código.

¿Alguien sabe por qué todas estas clases necesitan implementarIDisposable? (Microsoft tiene muchosejemplos de código en línea que no se preocupe por deshacerse de muchos de estos objetos). ¿Están escribiendo otros desarrolladores?using declaraciones para todos ellos? Y, si no, ¿cómo decides cuáles pueden prescindir?

Respuestas a la pregunta(3)

Su respuesta a la pregunta