Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Создание финализируемых объектов






В предыдущих статьях мы выяснили алгоритм работы сборщика мусора. Мы узнали, что перед удалением объекта, CLR определяет структуру ссылок на объект и при их реальном отсутствии помечает объект на удаление. Это первая фаза удаления объекта. Следующая фаза начинается с помещения этих объектов в очередь процесса, называемого финализацией. Ну а за тем сборщик мусора выполняет процесс финализации, в ходе которого для каждого объекта вызывается метод Finalize(). Данный метод имеется у любого объекта, унаследованного от System.Object.

Итак. Мы выяснили, что удаление объекта выполняется методом Finalize(). Также мы знаем, что любой объект имеет в своем распоряжении метод Finalize(). Данный метод по умолчанию не делает ничего перед тем, как объект будет удален. Естественно нас это не всегда устраивает. Поэтому данный метод в пользовательских классах следует (если это действительно необходимо) переопределять. Но, на самом деле, c# не позволяет обычным образом переопределить метод Finalize(). Вместо это следует использовать деструкторы:

Сразу следует запомнить следующие правила по определению деструкторов:

  • В структурах определение деструкторов невозможно. Они применяются только в классах. Это логично с той позиции, что сборка мусора касается управляемой кучи, то-есть ссылочных объектов, а структуры размещаются в стеке;
  • Класс может иметь только один деструктор.
  • Деструкторы не могут наследоваться или перегружаться;
  • Деструкторы невозможно вызвать. Они запускаются автоматически;
  • Деструктор не принимает модификаторы и не имеет параметров.

Еще раз повторим, что метод Finalize() не может бать вызван непосредственно из кода. Это объясняется тем, что понятия деструктора в CLR нет, а c# просто предоставляет нам конструкцию для работы с методом Finalize() именно через деструкторы. Его автоматический вызов происходит сборщиком мусора перед непосредственным удалением объекта из памяти. Реализуя метод Finalize() (через деструктор), мы можем гарантировать лишь то, что соответствующий объект сможет очистить неуправляемые ресурсы при сборке мусора.

Теперь подойдем к процессу сборки мусора с другого конца. В момент создания нового объекта в управляемой куче, CLR определяет, реализует ли данный объект пользовательский метод Finalize(). Если да, то объект помечается как финализируемый. Это опять же означает лишь гарантию того, что объект точно освободит неуправляемые ресурсы, но когда это произойдет, зависит от множества факторов и мы не можем на них повлиять.

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.006 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал