Що означає тильда перед назвою функції у C #?


164

Я дивлюся на якийсь код і в ньому є таке твердження:

~ConnectionManager()
{
    Dispose(false);
}

Клас реалізує IDisposableінтерфейс, але я не знаю, чи це частина того, для якого використовується тильда (~).

Відповіді:


213

~ - деструктор

  1. Деструктори викликаються автоматично, і їх не можна явно викликати.
  2. Деструктори не можна перевантажувати. Таким чином, клас може мати максимум одного деструктора.
  3. Деструктори не передаються у спадок. Таким чином, клас не має деструкторів, крім того, який може бути оголошений у ньому.
  4. Деструктори не можна використовувати з конструкціями. Вони використовуються лише на заняттях. Екземпляр стає придатним для знищення, коли більше не можна використовувати жоден код для використання цього примірника.
  5. Виконання деструктора для екземпляра може відбутися в будь-який час після того, як екземпляр стане придатним до знищення.
  6. Коли екземпляр руйнується, деструктори у його ланцюжку спадкування викликаються в порядку, від більшості похідних до найменш похідних.

Довершити

У C # метод Finalize виконує операції, які робив би стандартний C ++ деструктор. У C # ви не називаєте його Finalize - ви використовуєте синтаксис деструктора C ++ для розміщення символу tilde (~) перед назвою класу.

Утилізуйте

Переважно розміщувати об'єкти у Close()або Dispose()методі, який може бути явно викликаний користувачем класу. Фіналізація (деструктор) викликається ГК.

Інтерфейс IDisposable повідомляє світові, що ваш клас тримає ресурси, які потрібно розмістити, і надає користувачам спосіб звільнити їх. Якщо вам потрібно впровадити фіналізатор у своєму класі, ваш метод Dispose повинен використовувати GC.SuppressFinalize()метод, щоб забезпечити придушення завершення вашого примірника.

Що використовувати?

Нелегально викликати деструктора прямо. Ваш сміттєзвалитель буде викликаний сміттєзбірником. Якщо ви обробляєте дорогоцінні некеровані ресурси (такі як ручки файлів), які ви хочете закрити та видалити якомога швидше, вам слід застосувати інтерфейс IDisposable.


3
Я не знаю, як це було раніше. Але зараз деструктори передаються у спадок. Перевірте це посилання для отримання додаткової інформації (див. Приклад наприкінці): msdn.microsoft.com/en-us/library/66x5fx1b.aspx
RononDex

1
У пункті 3 @RononDex тієї самої сторінки, на яку ви посилаєтесь, зазначено "Фіналізатори не можуть бути успадковані" , що суперечить вашому коментарю. Це, правда, все трохи заплутано, оскільки, хоча вони не можуть бути успадковані, " Finalizeметод називається рекурсивно для всіх випадків у ланцюжку спадкування, від найбільш похідних до найменш отриманих" . Зауважте, що це не та сама поведінка, яку ви отримаєте від успадкованих деструкторів.
Марк Амері

@MarkAmery ах, я бачу, так в основному їх називають у зворотному порядку порівняно з тим, що передається у спадок?
RononDex

45

Це фіналізатор . Якщо чесно, вам дуже рідко потрібно писати фіналізатор. Вам дійсно потрібно написати лише той:

  • У вас є прямий доступ до некерованого ресурсу (наприклад, через an IntPtr), і ви не можете використовувати, SafeHandleщо полегшує
  • Ви реалізуєте IDisposableв класі, який не запечатаний. (Моя перевага - герметизація класів, якщо вони не призначені для успадкування.) Фіналізатор є частиною канонічного шаблону розпорядження в таких випадках.

9

Він використовується для позначення деструктора класу.


12
Вони обидва правильні, залежно від того, яку специфікацію C # ви прочитали. Найновіший MS (уніфікований C # 3.0) називає їх деструкторами (наприклад, розділ 10.13), але специфікація ECMA називає їх фіналізаторами.
Джон Скіт

@ 1800ІНФОРМАЦІЯ: Синтаксичний елемент правильно називається деструктором. Якщо клас має деструктор, компілятор C # автоматично генерує фіналізатор, який включає загальнокорисний try/finallyблок, який забезпечує Finalizeвиклик батьківського методу. Більшість речей, що стосуються деструкторів, стосуються фіналізаторів, і навпаки, але слова означають дещо інші речі.
supercat



1

~ зазвичай представляє деконструктор. який запускається прямо до вмирання об'єкта.

Ось опис знайдених я деконструкторів C #


4
правильний термін повинен бути деструктор / фіналізатор, а не деконструктор. Деконструктор означає синтаксис для деконструкції конструктора.
Еріаван Кусумавардхоно
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.