Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 20506|Ответ: 1

[Источник] C# Глубокое погружение - Разрушители

[Скопировать ссылку]
Опубликовано 17.08.2018 13:54:43 | | |
Деструкторы редко используются в C#, поэтому многие о них забыли, хотя они мало полезны и бесполезны для изучения.

Один.        Характеристики деструкторов:

Деструкторы могут существовать только в классах, а не в структурах; Деструктор не может иметь никаких модификаторов, включая модификаторы контроля доступа, статические модификаторы, абстрактные модификаторы, виртуальные модификаторы и т.д.; Деструктор не имеет параметров, то есть перегрузки не может быть.

Два.        Когда вызывать разрушителя:

Деструктор вызывается, когда объект перерабатывается мусоросборщиком, но у мусоросборщика есть характеристика: он ленивый,
Переменная не перерабатывается сразу после её выхода из области и срока службы, а только тогда, когда считает это уместным, обычно когда память ограничена. Например:

После возврата метода btn_Click de следует завершить, но его деструктор не вызывается, что указывает на то, что сборщик мусора не перерабатывал его; Когда вы закрываете форму, деструктор выполняется, что указывает на то, что в конце программы мусорщик вынужден неохотно его перерабатывать (^-^).
Конечно, мы можем вызвать GC.Collect(), чтобы заставить перерабатывать:

Когда вы нажимаете btn1, de1 и новый Demo() завершаются, и вызывается деструктор.
de2 ещё не истёк свой срок службы, поэтому даже если используется метод GC.Collect, он не будет перерабатываться; когда btn1_Click возвращается, de2 истёк, но из-за лени мусоросборщика он всё равно не перерабатывается; Только когда btn2 вызывает метод GC.Collect, de2 возвращается и вызывается его деструктор.

Один из способов предотвратить вызовы деструктора — реализовать интерфейс IDisposable, который определяет уникальный метод: Dispose().
Это предотвращает внутренний вызов деструктора, что означает, что если вам скучно, вы можете реализовать этот интерфейс без вызова GC.SuppressFinalize(^-^), который бессмысленен, так как не блокирует деструктор:

Теперь деструктор de1 не будет вызван.

Три.        Суть разрушителя:

Деструктор — это, по сути, метод, который имеет форму:

Обычно мы думаем, что деструкторы могут вызываться только системой, а не самими программистами, но это не совсем так, и деструкторов можно называть явно, ведь это всего лишь метод:

Деструкторы не требуются, если в классе не открыты неуправляемые ресурсы





Предыдущий:C# Различные условно дедупликационные объекты
Следующий:Исключение: «StrongTypingException: IsPrima...
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com