C # Форма. Закрити проти Форми. Утилізувати


88

Я новачок у C #, і я намагався переглянути попередні публікації, але не знайшов належної відповіді.

У програмі форми Windows C # з однією формою використовується Form.Close()краще чи Form.Dispose()?

MSDN каже, що всі ресурси в об'єкті закриваються, а форма утилізується, коли викликається Close. Незважаючи на це, я натрапив на кілька прикладів в Інтернеті, які слідують за Утилізацією, а не Закритим.

Чи має один перевагу над іншим? За яких сценаріїв ми повинні віддавати перевагу одному над іншим?


Трохи інше запитання, однакова відповідь, IMO: тобто Закрити та Утилізувати, як правило, еквівалентно, за винятком того, що Ви можете зателефонувати Закрити більше одного разу.
ChrisW

2
@Chrisw: Ви також можете зателефонувати Dispose більше одного разу.
Henk Holterman

@ChrisW, Dispose також повинен бути розроблений для запуску більше одного разу. bluebytesoftware.com/blog/…
Стівен Еверс

Річ, яка мене так зблизила === розпорядитися, а не закрити == форму. Я очікував, що закриття буде більш м'яким методом, ніж розпорядження.
Піт Кіркхем,

4
@Pete Kirkham: Якщо хочете form.Visible = false;, можете зателефонувати form.Hide(). Насправді form.Hide()просто набори this.Visible = false;.
Dirk Vollmar

Відповіді:


172

Цей форум про MSDN повідомляє вам.

Form.Close()надсилає належні повідомлення Windows, щоб вимкнути вікно win32. Під час цього процесу, якщо форма не відображалася модально, у формі викликається Dispose. Утилізація форми звільняє некеровані ресурси, на яких тримається форма.

Якщо ви зробите form1.Show()або Application.Run(new Form1()), при виклику буде викликано Dispose Close().

Однак якщо ви form1.ShowDialog() хочете показати форму модально, форма не буде утилізована, і вам потрібно буде зателефонувати form1.Dispose()собі. Я вважаю, що це єдиний раз, коли вам слід турбуватися про те, щоб самостійно розпорядитися формою.


Чи включала перша версія цитату? +1 для компенсації.
Henk Holterman

@ Дан перша версія смоктала ... (Вибачте @Kyra)
jjnguy

13
Це дещо не те саме, що стверджує MSDN за адресою msdn.microsoft.com/en-us/library/… : "Єдина умова, коли форма не розміщується в режимі" Закрити ", це коли вона є частиною інтерфейсу декількох документів (MDI) додаток, а форма не відображається. У цьому випадку вам потрібно буде зателефонувати Dispose вручну, щоб позначити всі елементи керування форми для збору сміття. Однак, легко перевірити, чи модальні форми розміщені чи ні, за допомогою простого зразка.
Dirk Vollmar


14

Як загальне правило, я завжди виступаю за явний виклик методу Dispose для будь-якого класу, який його пропонує, або за допомогою прямого виклику методу, або загортання в блок "using".

Найчастіше класи, що реалізують IDisposible, роблять це, оскільки вони обертають якийсь некерований ресурс, який потрібно звільнити. Хоча ці класи повинні мати фіналізатори, які виконують функцію запобіжника, виклик Dispose допоможе звільнити цю пам’ять раніше та з меншими накладними витратами.

У випадку з об'єктом Form, як зазначає посилання на Kyra, метод Close задокументовано, щоб викликати Dispose від вашого імені, тому вам не потрібно робити це явно. Однак для мене це завжди здавалося покладатися на деталь реалізації. Я вважаю за краще завжди дзвонити як Close, так і Dispose для класів, які їх реалізують, для захисту від змін / помилок реалізації та для того, щоб бути зрозумілими. Правильно реалізований метод Dispose повинен безпечно викликати кілька разів.



6

Не дзвонити, Closeймовірно, не обходить надсилання купу повідомлень Win32, які, на думку когось, є дещо важливими, хоча я не міг конкретно сказати вам, чому ...

Closeмає перевагу підняти події (які можна скасувати), так що сторонній (до форми) міг би спостерігати за цим FormClosingі FormClosedз метою відповідної реакції.

Мені незрозуміло, чи FormClosingта / або FormClosedпіднято, якщо ви просто розпоряджаєтесь формою, але я залишу це вам для експериментів.


2
Якщо ви розпоряджаєтесь формою, то закриті та закриті події не викликаються.
матриця

4
виклик методу Dispose призведе до мерехтіння вікна при використанні у Modal-Form над вікном mdi-child
dotNETbeginner


0

Закрити () - керований ресурс можна тимчасово закрити та відкрити ще раз.

Dispose () - назавжди видаляє керований або некерований ресурс


3
Це справедливо, лише якщо форма була показана за допомогою ShowDialog(). Інакше Close()також розпорядиться формою.
Пітер Дуніхо,

-1

Якщо ви використовуєте form.close () у своїй формі та встановлюєте FormClosing Event вашої форми і використовуєте form.close () у цій події, ви потрапляєте в необмежений цикл, і аргумент вийшов за межі діапазону, і рішення полягає в тому, щоб змінити форму .close () with form.dispose () у випадку закриття FormClosing. Сподіваюся, ця маленька підказка допоможе вам !!!


-1

Те, що я щойно експериментував з інструментами діагностики VS, називаю це. Close (), тоді ініціюється подія formclosing. Потім, коли я викликаю this.Dispose () наприкінці у заході Formclosing, де я розміщую в ній багато інших об’єктів, це очищає все набагато плавніше.

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