Если я заменяю изображение в управлении PictureBox, я должен расположить исходное изображение сначала?.Net Winforms

При следовании за моим вопросом здесь, если я заменяю изображение в поле изображения, я должен расположить исходное изображение сначала?

Или, что относительно этой ситуации:

Dim bm As New Bitmap(32,32)  
bm = New Bitmap(32,32)  
bm = New Bitmap(32,32)  
bm = New Bitmap(32,32)  

Делает bm должен только быть расположен в конце, или он должен быть расположен перед каждым воссозданием?


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

8
задан Community 23 May 2017 в 12:32
поделиться

3 ответа

Да, вы должны избавиться от старого объекта, прежде чем создавать новое изображение поверх той же переменной. Создавая новое изображение с той же переменной, вы удаляете ссылку на него. Если нет ссылок на старый объект, это означает, что он должен быть получен сборщиком мусора (GC). Хотя технически это «должно» в конечном итоге привести к освобождению памяти, предполагая, что финализатор позаботится о неуправляемых ресурсах, это большое предположение (вы даже не можете действительно предположить, что финализатор будет вызван) , и это требует дополнительной работы для системы.Нестандартные финализаторы вызывают дополнительную работу для GC с точки зрения повышения уровня сборки мусора, в результате чего требуется больше времени для освобождения памяти и количества запусков GC для этого.

Предполагается, что все написано, чтобы гарантировать, что финализатор обработает это. Каждый раз, когда у объекта есть метод Dispose (все, что реализует IDisposable, что и BitMap), его следует вызывать перед удалением ссылки на объект (выпадение из области видимости, удаление ссылки на объект и т. Д.).

Вот статья о том, как сборщик мусора работает в .net

http://www.devx.com/dotnet/Article/33167

Вот как MS утверждает, что утилита удаления / завершения должна быть реализована:

http://msdn.microsoft.com/en-us/library/b1yfkh5e.aspx

5
ответ дан 5 December 2019 в 14:02
поделиться

Да, вы должны. Он реализует IDisposable.
Как общее правило, утилизируйте все объекты, реализующие IDisposable. Не оставляйте это на GC.

2
ответ дан 5 December 2019 в 14:02
поделиться

Нужно ли удалять bm только в конце, или его следует удалять перед каждым воссозданием?

Его следует удалять перед каждым " отдых ». Не путайте объект со ссылкой на объект. «new Bitmap» создает новый объект. «bm» - это ссылка, которая указывает на этот объект. Они не одинаковы. Здесь вы не «воссоздаете» какой-либо объект - вы создаете новый объект, а затем отбрасываете все ссылки на предыдущий объект, что означает, что я буду собирать мусор через некоторое время в (ближайшем) будущем.

2
ответ дан 5 December 2019 в 14:02
поделиться