Что подразумевается под «управляемыми» и «неуправляемыми» ресурсами в .NET?

Ответы:

80

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

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

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

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

Роб
источник
20
Я бы немного пояснил: «неуправляемый ресурс» - это то, что сборщик мусора не знает, как очистить его, если он заброшен. Подписка краткосрочного объекта на событие от долгоживущего объекта, например, будет неуправляемым ресурсом, даже если оба объекта находятся под контролем сборщика мусора, поскольку GC не сможет узнать, что подписка должен быть отменен, если подписчик отказался, а издатель - нет. Если бы неограниченное количество подписчиков могло быть создано и оставлено в течение жизни издателя, это вызвало бы утечку памяти.
supercat
12
Добавим немного дополнительных пояснений: SqlConnection (или FileStream и т. Д.) - это управляемые ресурсы, которые внутренне используют неуправляемые ресурсы, о которых GC не знает.
jimvfr
2
jimvfr прав, SqlConnection - это пример управляемых ресурсов. Примером неуправляемых ресурсов является случай, когда нам нужно выделить память из неуправляемой памяти с помощью метода Marshal.AllocHGlobal (), это неуправляемый ресурс, в этом случае лучше всего использовать деструктор (~ ctor) и вызвать Marshal.FreeHGlobal () освободить эту память.
Ygor Thomaz
не могли бы вы привести пример как для управляемых, так и для неуправляемых ресурсов.
Радха Манохар
32

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

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

Одед
источник
13

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

Я думаю о терминах «управляемый» и «неуправляемый» так:

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

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

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

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

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

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

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

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


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

DavidRR
источник
5

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

Подробнее - http://bytes.com/topic/c-sharp/answers/276059-what-unmanaged-resources.

Сачин Шанбхаг
источник
1
«Идея интерфейса IDisposable состоит в том, чтобы позволить вам очищать ресурсы детерминированным образом и очищать неуправляемые ресурсы».
zionpi
0

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

анил
источник