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