пятница, 20 июня 2014 г.

Dispose vs Finalize

1. Особливості
 • Обидва методи використовуються для звільнення  і очистки unmanaged ресурсів (коннект до бази даних, файлу, нетворк соккети)
 • Finalize() представлений у вигляді деструктора. Клас який містить Dispose()  метод повинен наслідувати
 IDisposable інтерфейс

 • Типи значення не можуть містити деструктор

 • Finalize() метод викликається автоматично перед тим як Garbage Collector  видалить обєкт з кучі. Не можемо виклики метод Finalize() явно в коді. Але викликавши GC.SupressFinalize() вказуэмо шо для даного об'єктi не потрібно викликати метод Finalize()

 •   Dispose()  викликається явно (Explicitly) в коді  і автоматично в констркції  "using"  

 • Використання Finalize() знижує перформанс порявняно з використанням Dispose(). Оскільки для об'єкту який містить деструктор зберігається вказівник на цей об'єкт в черзi фіналізації  і об'єкт може бути видалиний не скоріше як за 2 рази сборки мусору

 2.  Використання
 • я б викликав  Dispose()   метод  після закінчення операції над певним ресурсом (файл, коннект до бд) для надання  можливості  іншим об'єктам (програмам) працювати з цим ресурсом.  В інакшому випадку операції з  ресурсом (файл, коннект до бд)  будуть заблокані до моменту коли викличеться фіналізатор (перед видаленням об'єкта Garbage Collector)

 • Як на  мене   очистка unmanaged ресурсів через Finalize() метод  є альтернативою (останній шанс)   на випадок якшо не був  викликаний Dispose() метод.

 • Теоретично структури не можуть містити деструктор ,   тому можна використати Dispose() через наслідування IDisposable інтерфейсу для очистки unmanaged ресурсів в структурах.  Але на практиці такий варіант дуже мало ймовірний

Комментариев нет:

Отправить комментарий