Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 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