Що розуміється під термінами керований ресурс та некерований ресурс у .NET? Як вони входять у картину?
Що розуміється під термінами керований ресурс та некерований ресурс у .NET? Як вони входять у картину?
Відповіді:
Термін "некерований ресурс" зазвичай використовується для опису чогось, що не знаходиться безпосередньо під контролем сміттєзбірника . Наприклад, якщо ви відкриєте підключення до сервера баз даних, це використовуватиме ресурси на сервері (для підтримки з’єднання) та, можливо, інші не -.net ресурси на клієнтській машині, якщо постачальник не повністю записаний в керованому коді.
Ось чому для чогось типу підключення до бази даних рекомендується таким чином написати свій код:
using (var connection = new SqlConnection("connection_string_here"))
{
// Code to use connection here
}
Оскільки це забезпечує те, що .Dispose()
викликається об'єктом з'єднання, забезпечуючи очищення будь-яких некерованих ресурсів.
В питаннях Питання Що таке некеровані ресурси? 1 , Брюс Вуд розмістив наступне:
Я думаю про терміни "керований" і "некерований" таким чином:
"Керований" відноситься до всього, що знаходиться в. Сюди входять усі класи .NET Framework.
"Некерований" відноситься до пустелі поза пісочницею .NET. Сюди входить все, що повертається вам за допомогою дзвінків до функцій API Win32.
Якщо ви ніколи не викликаєте функцію API Win32 і ніколи не отримуєте назад жодних об’єктів "обробляти" Win32, то у вас немає ніяких некерованих ресурсів. Файли та потоки, які ви відкриваєте за допомогою методів класу .NET Framework - всі керовані обгортки.
Коментар: у вас може не бути безпосередньо керований ресурс . Однак, можливо, ви керуєте некерованим ресурсом опосередковано через керований "клас обгортки", такий як System.IO.FileStream . Такий клас обгортки зазвичай реалізує IDisposable (безпосередньо або через спадщину).
... багато керованих (.NET Framework) об'єктів містять некеровані ресурси всередині них, і ви, ймовірно, хочете розпоряджатися () ними, як тільки зможете, або принаймні запропонуйте своїм абонентам можливість це зробити. Ось тут і входить написання власного методу Dispose (). По суті, реалізація IDisposable () робить для вас дві речі:
Дозволяє позбутися будь-яких ресурсів, які ви захопили безпосередньо з операційної системи за спиною .NET (некеровані ресурси).
Дозволяє вам та вашим абонентам випускати здоровенні .NET-об’єкти / .NET-об’єкти, які зберігають дорогоцінні ресурси у своїх рум’яних маленьких руках, яких ви / ваші абоненти хочуть звільнити зараз .
Коментар: Реалізуючи IDisposable
і тим самим надаючи Dispose()
метод, ви дозволяєте користувачеві вашого класу детерміновано випускати будь-які некеровані ресурси, які зберігаються екземпляром вашого класу.
1 Посилання, спочатку поділене у відповіді Сачіна Шенбга . Цитований матеріал від 2005-11-17. Зауважте, що я легко скопіював редагування змісту, що цитується.
Основна відмінність керованого та некерованого ресурсу полягає в тому, що збирач сміття знає про всі керовані ресурси, в якийсь момент GC зійде і очистить всю пам'ять та ресурси, пов'язані з керованим об'єктом. GC не знає про некеровані ресурси, такі як файли, потік та ручки, тому якщо ви не очистите їх явно у своєму коді, то у вас з’явиться витоки пам'яті та заблоковані ресурси.
Детальніше - http://bytes.com/topic/c-sharp/answers/276059-what-unmanaged-resources