2010-08-31 2 views

ответ

54

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

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

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

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

+8

Я бы уточнил это немного: «неуправляемый ресурс» - это то, что сборщик мусора не знает, как очистить после, если он заброшен. Например, короткоживущая подписка объекта на событие из долгоживущего объекта будет неуправляемым ресурсом, хотя оба объекта находятся под контролем сборщика мусора, поскольку GC не будет знать, что подписка должен быть отменен, если абонент будет оставлен, но издателем нет. Если неограниченное количество подписчиков может быть создано и оставлено в течение срока действия издателя, это может привести к утечке памяти. – supercat

+8

Добавление немного дополнительных разъяснений: SqlConnection (или FileStream и т. Д.) - это управляемые ресурсы, которые внутренне используют неуправляемые ресурсы, о которых GC не знает. – jimvfr

+1

jimvfr прав, SqlConnection - пример управляемых ресурсов. Примером неуправляемых ресурсов является необходимость выделения памяти из неуправляемой памяти с помощью метода Marshal.AllocHGlobal(), который является неуправляемым ресурсом. В этом случае лучшая практика использует деструктор (~ ctor) и вызывает Marshal.FreeHGlobal() чтобы освободить эту память. –

23

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

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

6

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

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

+1

«Идея интерфейса IDisposable - позволить вам очищать ресурсы детерминированным способом и очищать неуправляемые ресурсы». Удивительно! – zionpi

0

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

4

В Q & What are unmanaged resources? , Брюс Вуд писал следующее:

Я думаю, что термины "управляемых" и "неуправляемый" таким образом:

«Управляемый « ссылается на что-либо в песочнице .NET. Это включает в себя все классы .NET Framework.

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

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

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

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

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

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

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


Link первоначально разделял Sachin Shanbhag's answer. Цитированный материал от 2005-11-17 гг. Обратите внимание, что я слегка скопировал отредактированный цитированный контент.

Смежные вопросы