Подтвердить что ты не робот

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

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

  • Когда я должен использовать утилиту() на графический код с рисунком?
  • Что произойдет, если я не?
  • Нужно ли мне называть это каждый графику не видно, как на графическом интерфейсе, который имеет вкладки и пользователь переключился на другую вкладку и затем перерисовать его, когда они вернутся?
  • Я сломаю вещи, если я позвоню, когда не буду?
  • Будет ли Бэтмен избегать злых кладок Джокер?
4b9b3361

Ответ 1

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

Ответ 2

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

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

Это говорит о том, что вам никогда не придется называть себя. Намного лучше разместить объект в области видимости:

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

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

Ответ 3

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

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

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

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

Ответ 4

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