O ADO.NET exagera no IDisposable?

Quando o .NET foi lançado, eu era um dos muitos que reclamavam da falta de finalização determinística do .NET (os destruidores de classe eram chamados em um cronograma imprevisível). O compromisso que a Microsoft surgiu na época era ousing declaração.

Embora não seja perfeito, acho que usarusing é importante garantir que os recursos não gerenciados sejam limpos em tempo hábil.

No entanto, estou escrevendo um código ADO.NET e notei que quase todas as classes implementamIDisposable. Isso leva a um código que se parece com isso.

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 fortemente suspeito que eu não preciso de todosusing afirmações. Mas sem entender o código de cada classe em alguns detalhes, é difícil ter certeza de quais eu posso deixar de fora. Os resultados são meio feios e prejudicam a lógica principal do meu código.

Alguém sabe por que todas essas classes precisam implementarIDisposable? (A Microsoft tem muitosexemplos de código online que não se preocupem em descartar muitos desses objetos.) Outros desenvolvedores estão escrevendousing declarações para todos eles? E, se não, como você decide quais podem ficar sem?

questionAnswers(3)

yourAnswerToTheQuestion