Что подразумевается под "управляемыми" против "неуправляемых" ресурсов в .NET? - PullRequest
97 голосов
/ 31 августа 2010

Что подразумевается под терминами управляемый ресурс и неуправляемый ресурс в .NET? Как они попадают в картину?

Ответы [ 5 ]

64 голосов
/ 31 августа 2010

Термин "неуправляемый ресурс" обычно используется для описания чего-либо , не находящегося непосредственно под контролем сборщика мусора .Например, если вы открываете соединение с сервером базы данных, оно будет использовать ресурсы на сервере (для поддержания соединения) и, возможно, другие ресурсы, отличные от .net на клиентском компьютере, если поставщик не полностью записан в управляемом коде.

Вот почему для соединения с базой данных рекомендуется писать код следующим образом:

using (var connection = new SqlConnection("connection_string_here"))
{
    // Code to use connection here
}

Поскольку это гарантирует, что .Dispose() вызывается для объекта соединения, гарантируя, чтовсе неуправляемые ресурсы очищены.

28 голосов
/ 31 августа 2010

Управляемые ресурсы - это те, которые являются чистым кодом .NET и управляются средой выполнения и находятся под его прямым контролем.

Неуправляемые ресурсы - это те, которые не являются. Файловые дескрипторы, закрепленная память, COM-объекты, соединения с базой данных и т. Д.

9 голосов
/ 24 ноября 2015

В Q & A Что такое неуправляемые ресурсы? 1 , Брюс Вуд опубликовал следующее:

Я думаю оТермины «управляемый» и «неуправляемый» следующим образом:

«Управляемый» относится к чему-либо в изолированной программной среде .NET.Сюда входят все классы .NET Framework.

«Неуправляемый» относится к пустыне за пределами песочницы .NET.Это включает в себя все, что возвращается вам через вызовы функций Win32 API.

Если вы никогда не вызываете функцию Win32 API и никогда не возвращают какой-либо дескриптор Win32объекты, то вы не держите никаких неуправляемых ресурсов.Все файлы и потоки, которые вы открываете с помощью методов класса .NET Framework, являются управляемыми оболочками.

Комментарий: Возможно, вы не удерживаете неуправляемый ресурс напрямую .Однако вы можете удерживать неуправляемый ресурс косвенно через управляемый «класс-оболочку», такой как System.IO.FileStream .Такой класс-оболочка обычно реализует IDisposable (напрямую или через наследование).

... многие управляемые (.NET Framework) объекты содержат внутри себя неуправляемые ресурсы, и вывозможно, вы хотите избавиться от них () как можно скорее или, по крайней мере, предложить своим абонентам возможность сделать это.Вот где приходит написание вашего собственного метода Dispose (). По сути, реализация IDisposable () делает для вас две вещи:

  1. Позволяет вам избавиться от любых ресурсов, которые вы получили непосредственно от операционной системы.Система за спиной .NET (неуправляемые ресурсы).

  2. Позволяет вам и вашим абонентам освобождать здоровенные объекты .NET / .NET, которые хранят драгоценные ресурсы в своих грязных маленьких руках, которые вы /ваши абоненты хотят освободить сейчас .

Комментарий: Реализуя IDisposable и, таким образом, предоставляя метод Dispose(), выпозволяют пользователю вашего класса освобождать детерминированным способом любые неуправляемые ресурсы, которые хранятся в экземпляре вашего класса.


1 Ссылка, к которой изначально предоставлен общий доступв ответ Сачин Шанбхаг .Цитируемый материал от 2005-11-17.Обратите внимание, что я слегка отредактировал цитируемое содержание.

5 голосов
/ 31 августа 2010

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

Для более подробной информации - http://bytes.com/topic/c-sharp/answers/276059-what-unmanaged-resources

0 голосов
/ 02 июля 2012

Управляемые ресурсы - это ресурсы, которые могут быть освобождены сборщиком мусора, а неуправляемые ресурсы не могут быть освобождены сборщиком мусора, для этого требуется деструктор.

...