Управляемые против неуправляемых ресурсов в .NET. Какая разница? - PullRequest
3 голосов
/ 17 марта 2011

Я читал главу Wrox Professional C # 4 и .NET 4"Управление памятью и указатели", в частности, о том, как работает сборка мусора в .NET.Это объясняется тем, что «сборщик мусора не знает, как освобождать неуправляемые ресурсы (такие как дескрипторы файлов, сетевые подключения и подключения к базе данных)», именно поэтому такие классы должны либо объявлять деструктор (он же"finalizer") или реализовать IDisposable.

Кажется, что все эти примеры "неуправляемых ресурсов" связаны с взаимодействием с системой, которая является внешней по отношению к приложению и независимой от .NET Framework.Однако я не уверен, что это полное различие, которое проводится, поэтому

Что именно является отличительной характеристикой, которую имеет неуправляемый ресурс, а управляемого нет?

Ответы [ 4 ]

3 голосов
/ 17 марта 2011

Вы правильно поняли:
Управляемыми ресурсами управляет CLR, неуправляемые - нет.Другими словами: управляемые ресурсы существуют только в мире .NET, где неуправляемые ресурсы относятся к обычному миру Win32.

2 голосов
/ 17 марта 2011

С управляемыми ресурсами (т. Е. С памятью) вам не нужно беспокоиться о том, что с ними случится после того, как вы их используете;CLR позаботится об этом.

Неуправляемые ресурсы (есть несколько типов: объекты ядра Windows, объекты GDI, объекты USER) должны быть возвращены в систему, когда вы их используете.Это происходит автоматически, когда ваш процесс завершается, но если он утечет в это время, у вас есть большая проблема, потому что вы пропускаете ресурсы , общие для всех процессов в системе .

Конечно,В .NET есть несколько классов, которые обертывают эти неуправляемые ресурсы (используя шаблон dispose / finalize ) и выполняют тяжелую работу за вас.Используйте их, если можете.

0 голосов
/ 17 марта 2011

Термин «неуправляемый ресурс» сбивает с толку. Более полезная концепция - «ответственность за уборку». Если объект содержит неуправляемые ресурсы, это означает три вещи:

  1. Он манипулирует каким-то долгоживущим существом вне себя,
  2. Эта сущность может находиться в состоянии, требующем очистки, и
  3. Объект отвечает за обеспечение необходимой очистки

Как правило, термин «управляемый ресурс» используется для обозначения объектов, которые содержат неуправляемые ресурсы, но которые получат уведомление от сборщика мусора (с помощью процедуры Finalize), если они будут обнаружены как оставленные, и которые будут использовать такие уведомление о необходимости очистки (в случае, если они были оставлены до того, как был вызван их обычный метод очистки). Некоторые люди используют термин «управляемый ресурс» для обозначения вещей, которые не требуют какой-либо очистки, но мне не нравится такое использование, поскольку нет другого хорошего термина для обозначения вещей, которые должны быть очищены вручную, но будет использовать завершение как запасной вариант, если обычная очистка не произойдет.

Обратите внимание, что, хотя неуправляемые ресурсы часто являются дескрипторами ОС для файлов, объектами GDI и т. Д., Думать о них в таких терминах ошибочно. Возможно иметь неуправляемые ресурсы, которые не имеют доступа ни к чему вне .Net Framework; обработчики событий - типичный пример этого. Критическим аспектом неуправляемых ресурсов является то, что они нуждаются в очистке, и неспособность выполнить такую ​​очистку будет иметь некоторые нежелательные последствия.

0 голосов
/ 17 марта 2011

Я бы сказал, что обычно все, что создается с использованием .Net Framework, является управляемым ресурсом. Внутренне они могут использовать неуправляемые ресурсы, но, с вашей точки зрения, ими управляют. Одним из исключений к этому является когда вы P / Invoke. Хотя вы создаете функцию, которая работает с .Net, вызов передается за пределы «песочницы» .Net и поэтому считается неуправляемым.

Ответ на @ supercat

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

Я думаю, что здесь есть две разные вещи. Там обсуждается управляемый против неуправляемого и есть обсуждение управления памятью для приложения. Возможно, вам следует обращаться с некоторыми объектами так, как будто они неуправляемые, но это не значит, что они неуправляемые. Например, класс Brush, который я бы посчитал управляемым, но вы должны рассматривать его как неуправляемый, вызывая Dispose(). В классе скрыты / абстрагированы неуправляемые объекты, о которых, как вы надеетесь, Dispose() позаботится. Но Dispose() на самом деле не освобождает ресурсы, это всего лишь шаблон, который, как вы надеетесь, разработчики реализуют правильно.

Чтобы пойти дальше, я бы сказал, что большинство неуправляемых объектов создаются путем вызова CreateXYZ() метода Win32, который возвращает указатель, но должен быть освобожден с использованием метода `DestroyXYZ () / DeleteXYZ () ', который принимает тот же указатель. С другой стороны, управляемые объекты реализуют Dispose / Finalize, чтобы сделать это для вас. Еще раз, вы надеетесь, что авторы управляемых ресурсов сделали это, но нет никакой гарантии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...