Я учусь тянуть материал в C#, и я продолжаю видеть, что рекомендации использовать располагают (), но я не вполне понимаю то, что он делает.
IDisposable
, вы должны вызвать Dispose
непосредственно перед тем, как он станет подходящим для сборки мусора. Как указывали другие, лучше использовать оператор using
вместо прямого вызова Dispose
. StreamWriter
). По этой причине, как правило, лучше всегда удалять любой класс, реализующий IDisposable
. Dispose
до того, как закончите работу с объектом, а затем попытаетесь использовать удаленный объект, вы получите исключение ObjectDisposedException
. Когда вы запрашиваете графический объект, Windows выделяет вам немного памяти. Вызов утилиты очистит память за вас. Если вы не вызовете dispose, все эти дескрипторы памяти останутся открытыми, и в конечном итоге ваша система исчерпает ресурсы, станет медленнее и в конечном итоге остановится (однако закрытие программы может освободить их).
Поскольку вы используете .NET, когда вы закончите использовать свой графический объект, сборщик мусора в конечном итоге вызовет за вас dispose. Проблема со сборщиком мусора заключается в том, что вы никогда не знаете, когда он очистит объект, поэтому он может оставить эти ресурсы открытыми дольше, чем необходимо.
При этом вам ни в коем случае не следует призывать себя распоряжаться. Гораздо лучше будет поместить ваш объект в using scope:
using(Graphics g)
{
// do something with the resource
}
Теперь, когда вы выйдете из этого using scope, объект будет уничтожен, и для вас автоматически будет вызвано dispose. Вы должны поместить все объекты, для которых определен метод dispose, в область using.
Говоря языком новичков, Dispose () предназначен для очистки после того, как вы закончили использование неуправляемого ресурса.
Что такое неуправляемый ресурс? Это все то, чем CLR не управляет за вас. Это такие вещи, как дескрипторы файлов, подключения к базам данных, сетевые сокеты, ручки GDI + и т. Д. Вы получаете доступ к этим вещам через типичный объект .NET, но он будет реализовывать IDisposable, чтобы вы могли правильно очистить.
Зачем убирать? Пока вы не уберете за собой, этот ресурс будет недоступен для использования другими частями программы. В этом отношении вы ломаете вещи, потому что тратите ресурсы.
Зачем это делать самому? Вы должны сделать это самостоятельно, как только перестанете нуждаться в ресурсе, а не полагаться на автоматическую магию сборщика мусора, потому что это может занять много времени (ну, не указано). времени до того, как сборщик мусора доберется до него. Пока объект не был удален должным образом, вы не можете повторно использовать базовый ресурс, поэтому ваша программа не будет работать надежно.
Митч Уит говорит - Всегда вызывайте Dispose () для любого объекта, реализующего IDisposable. Дескрипторы GDI, используемые графическими объектами, неуправляемы и требуют удаления, когда вы закончите с ними.