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