Основное различие между Close()
и Dispose()
заключается в том, что при вызове метода Close()
любой управляемый ресурс может быть временно закрыт и снова открыт. Это означает, что с одним и тем же объектом ресурс может быть вновь открыт или использован. Где, как метод Dispose()
навсегда удаляет любой ресурс ((не) управляемый) из памяти для очистки, и ресурс больше не существует для дальнейшей обработки.
Или просто общее утверждение. С помощью объекта соединения вызов Close()
освободит соединение обратно в пул. Вызов Dispose()
вызовет Close()
, а затем установит для строки подключения значение null.
Некоторые объекты, такие как Stream, реализуют IDisposable
, но метод Dispose доступен только в том случае, если вы сначала приведете объект к IDisposable
. Тем не менее, он предоставляет метод Close()
.
Я бы всегда утверждал, что вы должны вызывать Dispose()
для любого объекта, который реализует IDisposable
, когда вы закончите с этим объектом. Даже если это ничего не делает. Jit-компилятор все равно оптимизирует его из окончательного кода. Если объект содержит Close()
, но не Dispose()
, тогда вызовите Close()
.
Вы также можете использовать оператор using для IDispoable
объектов
using(SqlConnection con = new SqlConnection())
{
//code...
}
Это вызовет Dispose()
в SqlConnection при выходе из блока.