Деструкторы редко используются в C#, поэтому многие о них забыли, хотя они мало полезны и бесполезны для изучения.
Один. Характеристики деструкторов:
Деструкторы могут существовать только в классах, а не в структурах; Деструктор не может иметь никаких модификаторов, включая модификаторы контроля доступа, статические модификаторы, абстрактные модификаторы, виртуальные модификаторы и т.д.; Деструктор не имеет параметров, то есть перегрузки не может быть.
Два. Когда вызывать разрушителя:
Деструктор вызывается, когда объект перерабатывается мусоросборщиком, но у мусоросборщика есть характеристика: он ленивый, Переменная не перерабатывается сразу после её выхода из области и срока службы, а только тогда, когда считает это уместным, обычно когда память ограничена. Например:
После возврата метода btn_Click de следует завершить, но его деструктор не вызывается, что указывает на то, что сборщик мусора не перерабатывал его; Когда вы закрываете форму, деструктор выполняется, что указывает на то, что в конце программы мусорщик вынужден неохотно его перерабатывать (^-^). Конечно, мы можем вызвать GC.Collect(), чтобы заставить перерабатывать:
Когда вы нажимаете btn1, de1 и новый Demo() завершаются, и вызывается деструктор. de2 ещё не истёк свой срок службы, поэтому даже если используется метод GC.Collect, он не будет перерабатываться; когда btn1_Click возвращается, de2 истёк, но из-за лени мусоросборщика он всё равно не перерабатывается; Только когда btn2 вызывает метод GC.Collect, de2 возвращается и вызывается его деструктор.
Один из способов предотвратить вызовы деструктора — реализовать интерфейс IDisposable, который определяет уникальный метод: Dispose(). Это предотвращает внутренний вызов деструктора, что означает, что если вам скучно, вы можете реализовать этот интерфейс без вызова GC.SuppressFinalize(^-^), который бессмысленен, так как не блокирует деструктор:
Теперь деструктор de1 не будет вызван.
Три. Суть разрушителя:
Деструктор — это, по сути, метод, который имеет форму:
Обычно мы думаем, что деструкторы могут вызываться только системой, а не самими программистами, но это не совсем так, и деструкторов можно называть явно, ведь это всего лишь метод:
Деструкторы не требуются, если в классе не открыты неуправляемые ресурсы
|