C # Form.Close vs Form.Dispose - PullRequest
       13

C # Form.Close vs Form.Dispose

73 голосов
/ 23 июня 2010

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

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

MSDN говорит, что все ресурсы в объекте закрыты, и форма удаляется при вызове Close. Несмотря на это, я натолкнулся на несколько примеров онлайн, которые следуют за Уничтожением, а не Закрытием.

Имеет ли одно преимущество перед другим? При каких сценариях мы предпочитаем один другому?

Ответы [ 5 ]

150 голосов
/ 23 июня 2010

Этот форум на MSDN говорит вам.

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

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

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

14 голосов
/ 23 июня 2010

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

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

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

6 голосов
/ 23 июня 2010

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

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

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

1 голос
/ 17 декабря 2018

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

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

1 голос
/ 28 февраля 2018

Использование using - довольно хороший способ:

using (MyForm foo = new MyForm())
{
    if (foo.ShowDialog() == DialogResult.OK)
    {
        // your code
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...