Подтвердить что ты не робот

С# Form.Close vs Form.Dispose

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

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

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

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

4b9b3361

Ответ 1

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

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

Если вы выполните form1.Show() или Application.Run(new Form1()), Dispose form1.Show() при form1.Show() Close().

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

Использование using довольно неплохо:

using (MyForm foo = new MyForm())
{
    if (foo.ShowDialog() == DialogResult.OK)
    {
        // your code
    }
}

Ответ 6

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