DBCommand с использованием блока

У меня такой код:

using (MySqlConnection conn = new MySqlConnection(connStr))
{
    conn.Open();

    cmd = conn.CreateCommand();
    cmd.CommandText = "SELECT * FROM Events";
    cmd.CommandType = CommandType.Text;
    cmd.ExecuteNonQuery();
}

Прочитав несколько статей на этом сайте, можно сделать вывод, что DbCommand должен быть в блоке using, однако я не понимаю, зачем это нужно. Соединение закрыто, так что DbCommand удерживает, что требует блока using? Действительно ли, если класс наследуется от IDisposable, вы должны использовать блок using или вызывать вручную Dispose?

Я запустил симулятор со 100 потоками в приведенном выше коде, а также с кодом с блоком using на DbCommand, и я не увидел реальных различий в использовании памяти.


person Steven Blair    schedule 07.07.2015    source источник


Ответы (1)


DbCommand является абстрактным и не предполагает, какие собственные ресурсы будут содержать подкласс, зависящий от поставщика, и в каком порядке они должны быть освобождены. Правильное вложение using блоков кажется разумным неявным соглашением о кодировании.

person Laurent LA RIZZA    schedule 07.07.2015
comment
Это будет MySqlCommand, однако я спрашиваю, почему в этом конкретном примере потребуется оператор using, а не почему это может быть хорошей практикой кодирования. Если в этом примере у меня нет оператора using для MySqlCommand, есть ли у меня утечка ресурсов? - person Steven Blair; 07.07.2015
comment
Утечка ресурсов, если бы она была, была бы внутри собственного API MySQL, MYSQL_RES не mysql_free_result в этом случае. Но будет. IDisposable объекты обычно пишутся так, что когда объект находится в сборке мусора, нераспределенные ресурсы отбрасываются. - person Laurent LA RIZZA; 07.07.2015