Что подразумевается под терминами управляемого ресурса и неуправляемого ресурса в .NET? Как они попадают в картину?
Что означает "управляемые" и "неуправляемые" ресурсы в .NET?
Ответ 1
Термин "неуправляемый ресурс" обычно используется для описания того, что непосредственно не контролируется сборщиком мусора. Например, если вы открываете соединение с сервером базы данных, это будет использовать ресурсы на сервере (для поддержания соединения) и, возможно, другие ресурсы нетбука на клиентской машине, если поставщик не полностью написан в управляемом коде.
Вот почему, для чего-то вроде подключения к базе данных, рекомендуется написать код таким образом:
using (var connection = new SqlConnection("connection_string_here"))
{
// Code to use connection here
}
Так как это гарантирует, что на объект соединения вызывается .Dispose()
, чтобы очистить все неуправляемые ресурсы.
Ответ 2
Управляемые ресурсы - это те, которые являются чистым кодом .NET и управляются средой выполнения и находятся под ее прямым контролем.
Неуправляемые ресурсы - это те, которые не являются. Файловые дескрипторы, фиксированная память, COM-объекты, подключения к базам данных и т.д.
Ответ 3
В вопросах и ответах Что такое неуправляемые ресурсы? 1Брюс Вуд опубликовал следующее:
Я думаю о терминах "управляемый" и "неуправляемый" следующим образом:
"Управляемый" относится ко всему, что находится в изолированной программной среде .NET. Это включает в себя все классы .NET Framework.
"Неуправляемый" относится к пустыне за пределами песочницы .NET. Это включает в себя все, что возвращается вам через вызовы функций Win32 API.
Если вы никогда не вызываете API-функцию Win32 и никогда не возвращаете какие-либо "дескрипторные" объекты Win32, то у вас нет никаких неуправляемых ресурсов. Файлы и потоки, которые вы открываете с помощью методов класса .NET Framework, являются управляемыми оболочками.
Комментарий: Возможно, вы не владеете неуправляемым ресурсом напрямую. Однако вы можете удерживать неуправляемый ресурс косвенно через управляемый "класс-оболочку", такой как System.IO.FileStream. Такой класс-обертка обычно реализует IDisposable (напрямую или через наследование).
... многие управляемые (.NET Framework) объекты содержат внутри себя неуправляемые ресурсы, и вы, вероятно, захотите избавиться() от них как можно скорее или, по крайней мере, предложите своим вызывающим пользователям возможность сделать это. Вот где приходит написание собственного метода Dispose(). По сути, реализация IDisposable() делает для вас две вещи:
Позволяет избавиться от любых ресурсов, которые вы захватили непосредственно из операционной системы за спиной .NET (неуправляемые ресурсы).
Позволяет вам и вашим абонентам освобождать здоровенные объекты .NET/.NET, которые хранят драгоценные ресурсы в своих грязных маленьких руках, которые вы/ваши абоненты хотите выпустить сейчас.
Комментарий: IDisposable
и тем самым предоставляя метод Dispose()
, вы позволяете пользователю вашего класса детерминированным образом освобождать любые неуправляемые ресурсы, которые содержатся в экземпляре вашего класса.
1 Ссылка изначально поделился в ответе Сачин Шанбхаг. Цитируемый материал от 2005-11-17. Обратите внимание, что я слегка отредактировал цитируемое содержание.
Ответ 4
Основное различие между управляемым и неуправляемым ресурсом заключается в том, что сборщик мусора знает обо всех управляемых ресурсах, в какой-то момент времени GC придет и очистит всю память и связанные с ней ресурсы с управляемым объектом. GC не знает об неуправляемых ресурсах, таких как как файлы, потоки и ручки, поэтому, если вы не очищаете их явно в ваш код, тогда вы получите утечки памяти и заблокированные ресурсы.
Подробнее... http://bytes.com/topic/c-sharp/answers/276059-what-unmanaged-resources
Ответ 5
Управляемые ресурсы - это ресурсы, которые могут быть освобождены сборщиком мусора, а неуправляемые ресурсы не могут быть освобождены сборщиком мусора, для этого требуется деструктор.