C # Form.Close против Form.Dispose


88

Я новичок в C #, и я попытался просмотреть предыдущие сообщения, но не нашел хорошего ответа.

В приложении Windows Form на C # с единственной формой используется Form.Close()лучше или Form.Dispose()?

MSDN сообщает, что все ресурсы в объекте закрыты, и форма удаляется при вызове Close. Несмотря на это, я наткнулся на несколько примеров в Интернете, которые следуют за Dispose, а не за Close.

Есть ли у одного преимущество перед другим? В каких сценариях мы должны предпочесть одно другому?


Немного другой вопрос, тот же ответ, IMO: т.е. Close и Dispose обычно эквивалентны, за исключением того, что вы можете вызывать Close более одного раза.
ChrisW

2
@Chrisw: Вы также можете вызвать Dispose более одного раза.
Хенк Холтерман,

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

То, что меня так близко === dispose, а не close == form.Visible = false; Я ожидал, что закрытие будет более мягким методом, чем избавиться.
Пит Киркхэм

4
@ Пит Киркхэм: Если хочешь form.Visible = false;, можешь позвонить form.Hide(). На самом деле form.Hide()просто устанавливает this.Visible = false;.
Dirk Vollmar

Ответы:


171

Об этом вам сообщает этот форум в MSDN.

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

Если вы выполните form1.Show()или Application.Run(new Form1()), Dispose будет вызываться при Close()вызове.

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


Была ли цитата в первой версии? +1 для компенсации.
Хенк Холтерман,

@Dan, первая версия - отстой ... (Прости @Kyra)
jjnguy

13
Это несколько не то же самое, что MSDN утверждает на msdn.microsoft.com/en-us/library/… : «Единственное условие, когда форма не удаляется при закрытии, - это когда она является частью многодокументного интерфейса (MDI). application, и форма не отображается. В этом случае вам нужно будет вызвать Dispose вручную, чтобы пометить все элементы управления формы для сборки мусора ». Тем не менее, должно быть легко проверить, удаляются ли модальные формы или нет, с помощью простого образца.
Dirk Vollmar


14

Как правило, я всегда рекомендую явно вызывать метод Dispose для любого класса, который его предлагает, либо вызывая метод напрямую, либо заключая его в блок «using».

Чаще всего классы, реализующие IDisposible, делают это, потому что они обертывают некоторый неуправляемый ресурс, который необходимо освободить. В то время как эти классы должны иметь финализаторы, которые действуют в качестве защиты, вызов Dispose поможет освободить эту память раньше и с меньшими накладными расходами.

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



6

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

Closeимеет преимущество создания событий (которые могут быть отменены), чтобы посторонний (в форме) мог наблюдать FormClosingи FormClosedреагировать соответствующим образом.

Мне неясно, возникают ли FormClosingи / или FormClosedвозникают ли они, если вы просто удалите форму, но я оставлю это вам, чтобы поэкспериментировать.


2
При удалении формы события закрытия и закрытия не вызываются.
matrix

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


0

Close () - управляемый ресурс может быть временно закрыт и может быть открыт снова.

Dispose () - навсегда удаляет управляемый или неуправляемый ресурс


3
Это верно, только если форма была показана с использованием ShowDialog(). В противном случае Close()форма также будет удалена.
Питер Дунихо

-1

Если вы используете form.close () в своей форме и устанавливаете событие FormClosing для своей формы и либо используете form.close () в этом событии, вы попадаете в неограниченный цикл, а аргумент выходит за пределы допустимого диапазона, и решение состоит в том, чтобы изменить форму .close () с form.dispose () в событии FormClosing. Надеюсь, этот небольшой совет вам поможет !!!


-1

То, что я только что экспериментировал с инструментами диагностики VS, я назвал this.Close (), затем запускается событие закрытия формы. Затем, когда я вызываю this.Dispose () в конце события Formclosing, где я размещаю в нем много других объектов, он очищает все намного более плавно.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.