Що означає "керований" проти "некерованих" ресурсів у .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 () звільнити цю пам'ять.
Ігор Томаз

чи можете ви надати приклад як керованих, так і некерованих ресурсів.
Радха Манохар

32

Керовані ресурси - це ті, що є чистим .NET кодом і керуються під час виконання та перебувають під його безпосереднім контролем.

Некеровані ресурси - це такі, яких немає. Ручки файлів, закріплена пам'ять, об'єкти COM, підключення до бази даних тощо


13

В питаннях Питання Що таке некеровані ресурси? 1 , Брюс Вуд розмістив наступне:

Я думаю про терміни "керований" і "некерований" таким чином:

"Керований" відноситься до всього, що знаходиться в. Сюди входять усі класи .NET Framework.

"Некерований" відноситься до пустелі поза пісочницею .NET. Сюди входить все, що повертається вам за допомогою дзвінків до функцій API Win32.

Якщо ви ніколи не викликаєте функцію API Win32 і ніколи не отримуєте назад жодних об’єктів "обробляти" Win32, то у вас немає ніяких некерованих ресурсів. Файли та потоки, які ви відкриваєте за допомогою методів класу .NET Framework - всі керовані обгортки.

Коментар: у вас може не бути безпосередньо керований ресурс . Однак, можливо, ви керуєте некерованим ресурсом опосередковано через керований "клас обгортки", такий як System.IO.FileStream . Такий клас обгортки зазвичай реалізує IDisposable (безпосередньо або через спадщину).

... багато керованих (.NET Framework) об'єктів містять некеровані ресурси всередині них, і ви, ймовірно, хочете розпоряджатися () ними, як тільки зможете, або принаймні запропонуйте своїм абонентам можливість це зробити. Ось тут і входить написання власного методу Dispose (). По суті, реалізація IDisposable () робить для вас дві речі:

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

  2. Дозволяє вам та вашим абонентам випускати здоровенні .NET-об’єкти / .NET-об’єкти, які зберігають дорогоцінні ресурси у своїх рум’яних маленьких руках, яких ви / ваші абоненти хочуть звільнити зараз .

Коментар: Реалізуючи IDisposableі тим самим надаючи Dispose()метод, ви дозволяєте користувачеві вашого класу детерміновано випускати будь-які некеровані ресурси, які зберігаються екземпляром вашого класу.


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


5

Основна відмінність керованого та некерованого ресурсу полягає в тому, що збирач сміття знає про всі керовані ресурси, в якийсь момент GC зійде і очистить всю пам'ять та ресурси, пов'язані з керованим об'єктом. GC не знає про некеровані ресурси, такі як файли, потік та ручки, тому якщо ви не очистите їх явно у своєму коді, то у вас з’явиться витоки пам'яті та заблоковані ресурси.

Детальніше - http://bytes.com/topic/c-sharp/answers/276059-what-unmanaged-resources


1
"Ідея інтерфейсу IDisposable полягає в тому, щоб ви могли детерміновано очищати ресурси та очищати некеровані ресурси".
zionpi

0

Керовані ресурси - це ресурси, які можуть бути звільнені сміттєзбірником, а некеровані ресурси не можуть бути вивільнені сміттєзбірником для цієї мети.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.