Формы C#.Закрыть против формы.Распоряжаться



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



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



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



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

681   4  

4 ответов:

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

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

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

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

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

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

в случае из объекта Form, как отметила ссылка для Киры, метод 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
    }
}

Comments

    Ничего не найдено.