Когда я должен использовать, располагают () на графике?

Я учусь тянуть материал в C#, и я продолжаю видеть, что рекомендации использовать располагают (), но я не вполне понимаю то, что он делает.

  • Когда я должен использовать, располагают () на оттянутой из кода диаграмме?
  • Что происходит, если я не делаю?
  • Я должен назвать это каждым разом, когда диаграмма не видима, такой как на GUI, который имеет вкладки и пользователя, переключенного на другую вкладку, и затем перерисуйте его, когда они переключаются назад?
  • Я буду повреждать вещи, если я назову его, когда я не был должен?
  • Batman выйдет из злых муфт Шутника?
20
задан ROMANIA_engineer 20 October 2017 в 20:35
поделиться

4 ответа

  • Когда мне следует использовать dispose () для рисованной графики? Когда вы полностью закончите работу с любым объектом, реализующим IDisposable , вы должны вызвать Dispose непосредственно перед тем, как он станет подходящим для сборки мусора. Как указывали другие, лучше использовать оператор using вместо прямого вызова Dispose .
  • Что произойдет, если я этого не сделаю? Ваша программа будет немного менее эффективной, поскольку потребует немного больше ресурсов, чем необходимо. Это единственный недостаток отказа от удаления графики; , однако, отказ от удаления других классов может фактически вызвать ошибки (один известный пример - StreamWriter ). По этой причине, как правило, лучше всегда удалять любой класс, реализующий IDisposable .
  • Нужно ли мне вызывать его каждый раз, когда графика не отображается, например, в графическом интерфейсе, в котором есть вкладки, и пользователь переключился на другую вкладку, а затем перерисовал ее при переключении обратно? Нет. Объекты должны утилизируйте только тогда, когда вы полностью с ними покончили.
  • Я сломаю что-нибудь, если позвоню, когда не должен? Да. Если вы вызовете Dispose до того, как закончите работу с объектом, а затем попытаетесь использовать удаленный объект, вы получите исключение ObjectDisposedException .
  • Сможет ли Бэтмен вырваться из тисков злых лап Джокера? Настройтесь на завтра, то же время, то же время битвы, тот же канал биты!
30
ответ дан 30 November 2019 в 00:00
поделиться

Когда вы запрашиваете графический объект, Windows выделяет вам немного памяти. Вызов утилиты очистит память за вас. Если вы не вызовете dispose, все эти дескрипторы памяти останутся открытыми, и в конечном итоге ваша система исчерпает ресурсы, станет медленнее и в конечном итоге остановится (однако закрытие программы может освободить их).

Поскольку вы используете .NET, когда вы закончите использовать свой графический объект, сборщик мусора в конечном итоге вызовет за вас dispose. Проблема со сборщиком мусора заключается в том, что вы никогда не знаете, когда он очистит объект, поэтому он может оставить эти ресурсы открытыми дольше, чем необходимо.

При этом вам ни в коем случае не следует призывать себя распоряжаться. Гораздо лучше будет поместить ваш объект в using scope:

using(Graphics g)
{
    // do something with the resource
}

Теперь, когда вы выйдете из этого using scope, объект будет уничтожен, и для вас автоматически будет вызвано dispose. Вы должны поместить все объекты, для которых определен метод dispose, в область using.

5
ответ дан 30 November 2019 в 00:00
поделиться

Говоря языком новичков, Dispose () предназначен для очистки после того, как вы закончили использование неуправляемого ресурса.

Что такое неуправляемый ресурс? Это все то, чем CLR не управляет за вас. Это такие вещи, как дескрипторы файлов, подключения к базам данных, сетевые сокеты, ручки GDI + и т. Д. Вы получаете доступ к этим вещам через типичный объект .NET, но он будет реализовывать IDisposable, чтобы вы могли правильно очистить.

Зачем убирать? Пока вы не уберете за собой, этот ресурс будет недоступен для использования другими частями программы. В этом отношении вы ломаете вещи, потому что тратите ресурсы.

Зачем это делать самому? Вы должны сделать это самостоятельно, как только перестанете нуждаться в ресурсе, а не полагаться на автоматическую магию сборщика мусора, потому что это может занять много времени (ну, не указано). времени до того, как сборщик мусора доберется до него. Пока объект не был удален должным образом, вы не можете повторно использовать базовый ресурс, поэтому ваша программа не будет работать надежно.

3
ответ дан 30 November 2019 в 00:00
поделиться

Митч Уит говорит - Всегда вызывайте Dispose () для любого объекта, реализующего IDisposable. Дескрипторы GDI, используемые графическими объектами, неуправляемы и требуют удаления, когда вы закончите с ними.

0
ответ дан 30 November 2019 в 00:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: