Я дивлюся на якийсь код і в ньому є таке твердження:
~ConnectionManager()
{
Dispose(false);
}
Клас реалізує IDisposable
інтерфейс, але я не знаю, чи це частина того, для якого використовується тильда (~).
Я дивлюся на якийсь код і в ньому є таке твердження:
~ConnectionManager()
{
Dispose(false);
}
Клас реалізує IDisposable
інтерфейс, але я не знаю, чи це частина того, для якого використовується тильда (~).
Відповіді:
~ - деструктор
Довершити
У C # метод Finalize виконує операції, які робив би стандартний C ++ деструктор. У C # ви не називаєте його Finalize - ви використовуєте синтаксис деструктора C ++ для розміщення символу tilde (~) перед назвою класу.
Утилізуйте
Переважно розміщувати об'єкти у Close()
або Dispose()
методі, який може бути явно викликаний користувачем класу. Фіналізація (деструктор) викликається ГК.
Інтерфейс IDisposable повідомляє світові, що ваш клас тримає ресурси, які потрібно розмістити, і надає користувачам спосіб звільнити їх. Якщо вам потрібно впровадити фіналізатор у своєму класі, ваш метод Dispose повинен використовувати GC.SuppressFinalize()
метод, щоб забезпечити придушення завершення вашого примірника.
Що використовувати?
Нелегально викликати деструктора прямо. Ваш сміттєзвалитель буде викликаний сміттєзбірником. Якщо ви обробляєте дорогоцінні некеровані ресурси (такі як ручки файлів), які ви хочете закрити та видалити якомога швидше, вам слід застосувати інтерфейс IDisposable.
Finalize
метод називається рекурсивно для всіх випадків у ланцюжку спадкування, від найбільш похідних до найменш отриманих" . Зауважте, що це не та сама поведінка, яку ви отримаєте від успадкованих деструкторів.
Це фіналізатор . Якщо чесно, вам дуже рідко потрібно писати фіналізатор. Вам дійсно потрібно написати лише той:
IntPtr
), і ви не можете використовувати, SafeHandle
що полегшуєIDisposable
в класі, який не запечатаний. (Моя перевага - герметизація класів, якщо вони не призначені для успадкування.) Фіналізатор є частиною канонічного шаблону розпорядження в таких випадках.Він використовується для позначення деструктора класу.
try/finally
блок, який забезпечує Finalize
виклик батьківського методу. Більшість речей, що стосуються деструкторів, стосуються фіналізаторів, і навпаки, але слова означають дещо інші речі.
Те саме, що C ++, це деструктор; однак у C # ви не називаєте це чітко, він викликається, коли об'єкт збирається.
Див. Деструктори (Посібник з програмування C #) . Однак майте на увазі, що на відміну від C ++, програміст не контролює, коли викликається деструктор, оскільки це визначається сміттєзбірником.
~ зазвичай представляє деконструктор. який запускається прямо до вмирання об'єкта.