Шаблон утилизации: Как узнать, что управляется, а что нет? - PullRequest
6 голосов
/ 11 июля 2009

Читая о шаблоне Dispose , я вижу, что документация неоднократно ссылается на "очистку управляемого и неуправляемого кода". И в канонической реализации метода Dispose я вижу определенные потоки (в зависимости от того, истинно ли disposing или ложно), предназначенные для очистки управляемых объектов по сравнению с неуправляемыми объектами.

Но я, скромный новичок, знаю, какие типы управляются, а какие неуправляемыми?

Ответы [ 5 ]

5 голосов
/ 11 июля 2009

Неуправляемые означает нативные объекты Win32, главным образом дескрипторы; и ссылки на необработанные COM-объекты. Это ресурсы, которые не находятся под контролем (или не управляются) .NET CLR.

3 голосов
/ 11 июля 2009

Краткая версия: все, что также реализует IDisposable, должно вызываться в вашем методе Dispose. FxCop также сообщит вам, если вы что-то упустили (или вообще не используете IDisposable, когда вам следует).

2 голосов
/ 11 июля 2009

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

@ Роб:
Ответ все тот же. Если ваш класс управляет какими-либо внутренними объектами, которые реализуют IDisposable, он также должен реализовывать IDisposable. В вашем методе Dispose () вызовите Dispose для этих объектов.

0 голосов
/ 11 июля 2009

Я бы просто предложил уничтожить все ресурсы после их использования. Все, что обычно зависит от системных ресурсов, таких как сокеты и потоковые ресурсы, которые вы хотите явно освободить. Если есть сомнения, идите вперед и избавьтесь. Спасает вас много проблем отладки в долгосрочной перспективе. Обычно, когда вы вызываете код, который не написан на .NET, вы можете предположить, что это не «управляемый код».

0 голосов
/ 11 июля 2009

Если вы не знаете, используемые вами типы, вероятно, являются управляемыми.

Неуправляемые типы относятся к типам, которые не являются безопасными, т.е. не соответствуют требованиям безопасности CLR.

Большое определение связано :

Обновление

Я не понимаю понижение? Вопрос был конкретно в том, как провести различие между управляемым и неуправляемым типами?

Все остальные ответы касались вопроса IDispose, а не управляемого / неуправляемого вопроса!?

Обновление 2

Все еще нет объяснения второго понижения голосов ...

Я согласен, объект IDisposable всегда должен быть удален, но это не отвечает на вопрос об управляемом и неуправляемом.

...