2015-07-07 5 views
0

я следующий код:DbCommand с помощью блока

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

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

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

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

ответ

0

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

+0

Это будет MySqlCommand, однако, я спрашиваю, почему ** в этом конкретном примере потребуется использовать инструкцию using, а не почему это может быть хорошей практикой кодирования. Если у меня нет инструкции using для MySqlCommand в этом примере, есть ли утечка ресурса? –

+0

Утечка ресурсов, если таковая имеется, будет внутри встроенного API MySQL, в этом случае будет 'MYSQL_RES', а не' mysql_free_result''d. Но это будет так. Объекты IDisposable обычно записываются так, что когда объект GC'd, нераспределенные ресурсы диспидируются. –