Я новичок в C #, и я попытался просмотреть предыдущие сообщения, но не нашел хорошего ответа.
В приложении Windows Form на C # с единственной формой используется Form.Close()
лучше или Form.Dispose()
?
MSDN сообщает, что все ресурсы в объекте закрыты, и форма удаляется при вызове Close. Несмотря на это, я наткнулся на несколько примеров в Интернете, которые следуют за Dispose, а не за Close.
Есть ли у одного преимущество перед другим? В каких сценариях мы должны предпочесть одно другому?
form.Visible = false;
, можешь позвонитьform.Hide()
. На самом делеform.Hide()
просто устанавливаетthis.Visible = false;
.Ответы:
Об этом вам сообщает этот форум в MSDN.
источник
Как правило, я всегда рекомендую явно вызывать метод Dispose для любого класса, который его предлагает, либо вызывая метод напрямую, либо заключая его в блок «using».
Чаще всего классы, реализующие IDisposible, делают это, потому что они обертывают некоторый неуправляемый ресурс, который необходимо освободить. В то время как эти классы должны иметь финализаторы, которые действуют в качестве защиты, вызов Dispose поможет освободить эту память раньше и с меньшими накладными расходами.
В случае объекта Form, как указано в ссылке для Kyra, метод Close документирован для вызова Dispose от вашего имени, поэтому вам не нужно делать это явно. Однако мне всегда казалось, что нужно полагаться на детали реализации. Я предпочитаю всегда вызывать как Close, так и Dispose для классов, которые их реализуют, для защиты от изменений / ошибок реализации и для ясности. Правильно реализованный метод Dispose должен безопасно вызывать несколько раз.
источник
Отказ от вызова,
Close
вероятно, обходит отправку кучи сообщений Win32, которые, как можно было бы подумать, несколько важны, хотя я не мог конкретно сказать вам, почему ...Close
имеет преимущество создания событий (которые могут быть отменены), чтобы посторонний (в форме) мог наблюдатьFormClosing
иFormClosed
реагировать соответствующим образом.Мне неясно, возникают ли
FormClosing
и / илиFormClosed
возникают ли они, если вы просто удалите форму, но я оставлю это вам, чтобы поэкспериментировать.источник
Использование
using
- довольно хороший способ:using (MyForm foo = new MyForm()) { if (foo.ShowDialog() == DialogResult.OK) { // your code } }
источник
Close () - управляемый ресурс может быть временно закрыт и может быть открыт снова.
Dispose () - навсегда удаляет управляемый или неуправляемый ресурс
источник
ShowDialog()
. В противном случаеClose()
форма также будет удалена.Если вы используете form.close () в своей форме и устанавливаете событие FormClosing для своей формы и либо используете form.close () в этом событии, вы попадаете в неограниченный цикл, а аргумент выходит за пределы допустимого диапазона, и решение состоит в том, чтобы изменить форму .close () с form.dispose () в событии FormClosing. Надеюсь, этот небольшой совет вам поможет !!!
источник
То, что я только что экспериментировал с инструментами диагностики VS, я назвал this.Close (), затем запускается событие закрытия формы. Затем, когда я вызываю this.Dispose () в конце события Formclosing, где я размещаю в нем много других объектов, он очищает все намного более плавно.
источник