Ресурсы, которые должны быть очищены вручную в C #? - PullRequest
11 голосов
/ 22 сентября 2008

Какие ресурсы необходимо очистить вручную в C # и каковы последствия этого не делать?

Например, скажем, у меня есть следующий код:

myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Black);
// Use Brush

Если я не очищу кисть, используя метод dispose, я предполагаю, что сборщик мусора освобождает память, используемую при завершении программы? Это правильно?

Какие еще ресурсы мне нужно очистить вручную?

Ответы [ 14 ]

0 голосов
/ 23 сентября 2008

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

При использовании dispose или destructor in.net необходимо понимать, что время, когда GC вызывает функцию dispose, является недетерминированным. Поэтому рекомендуется явно использовать использование или вызов dispose.

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

Например, SolidBrush необходимо утилизировать, поскольку он является объектом GDI и находится за пределами мира .net.

0 голосов
/ 23 сентября 2008

Если он управляется (то есть является частью фреймворка), вам не нужно беспокоиться об этом. Если он реализует IDisposable, просто оберните его в блок using.

Если вы хотите использовать неуправляемые ресурсы, вам нужно ознакомиться с финализаторами и самостоятельно реализовать IDisposable.

В разделе этого вопроса гораздо больше деталей

0 голосов
/ 22 сентября 2008

Ну, пока вы используете управляемую версию ресурсов и не вызываете Windows API самостоятельно, у вас все должно быть в порядке. Беспокойство вызывает необходимость удалять / уничтожать ресурс только тогда, когда вы получаете IntPtr, поскольку «дескрипторы окон» (и многое другое) известны в .NET, а не объект.

Кстати, ресурс (как и любой другой объект .NET) будет помечен для сбора, как только вы выйдете из текущего контекста, поэтому, если вы создадите Brush внутри метода, он будет помечен при выходе из него.

0 голосов
/ 22 сентября 2008

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

Есть некоторые вещи, которые необходимо очистить вручную, но это указатели, извлекаемые из неуправляемых источников, таких как вызовы DLL, однако в .NET Framework такая обработка не требуется.

...