Formularz C#.Zamknij vs forma.Usunąć

Jestem nowy w C# i próbowałem spojrzeć na wcześniejsze posty, ale nie znalazłem dobrej odpowiedzi.

W aplikacji C # Windows Form z pojedynczym formularzem, czy użycie Form.Close() jest lepsze czy Form.Dispose()?

MSDN mówi, że wszystkie zasoby w obiekcie są zamknięte, a Formularz jest usuwany po wywołaniu zamknięcia. Pomimo tego natknąłem się na kilka przykładów w internecie, które podążają za Dispose, a nie blisko.

Czy jeden ma przewagę nad drugim? W jakich scenariuszach wolimy jedno od drugiego?
 66
Author: demonplus, 2010-06-23

4 answers

To forum na MSDN ci mówi.

Form.Close() wysyła odpowiednie okna Wiadomości do wyłączenia win32 okno. Podczas tego procesu, jeśli forma nie została pokazana modalnie, dyspozycja jest wezwałem formularz. Usuwanie formularza uwalnia niezarządzane zasoby, które Forma się trzyma.

Jeśli wykonasz form1.Show() lub Application.Run(new Form1()), zostanie wywołana, gdy {[3] } zostanie wywołana.

Jednakże, jeśli to zrobisz form1.ShowDialog() aby pokazać formę modalnie, formularz Wola nie można się pozbyć, a będziesz potrzebował aby zadzwonić form1.Dispose() do siebie. I / align = "left" / powinno się martwić o pozbycie się formularza siebie.

 135
Author: Kyra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-29 08:50:09

Ogólnie rzecz biorąc, zawsze opowiadałbym się za jawnym wywołaniem metody Dispose dla dowolnej klasy, która ją oferuje, albo przez wywołanie metody bezpośrednio, albo zawijanie jej w blok "using".

Najczęściej klasy implementujące IDisposible robią to, ponieważ owijają jakiś niezarządzany zasób, który musi zostać uwolniony. Podczas gdy te klasy powinny mieć finalizery, które działają jako zabezpieczenie, wywołanie Dispose pomoże uwolnić tę pamięć wcześniej i z niższym obciążeniem.

W przypadku formularza obiekt, jak zauważył link, metoda Close jest udokumentowana, aby wywołać Dispose w Twoim imieniu, więc nie musisz tego robić wyraźnie. Jednak dla mnie to zawsze wydawało się jak poleganie na szczegółach implementacji. Wolę zawsze wywoływać zarówno Close, jak i Dispose dla klas, które je implementują, aby chronić się przed zmianami/błędami implementacji i dla jasności. Prawidłowo wdrożona metoda usuwania powinna być bezpieczna do wielokrotnego wywoływania.

 12
Author: Jesse Squire,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-22 21:54:58

Nie wywołanie Close prawdopodobnie ominie wysyłanie kilku wiadomości Win32, które według mnie są dość ważne, chociaż nie mogłem dokładnie powiedzieć dlaczego...

Close ma tę zaletę, że organizuje wydarzenia (które można anulować) tak, aby osoba z zewnątrz (do formularza) mogła obserwować FormClosing i FormClosed, aby odpowiednio zareagować.

Nie wiem, czy FormClosing i/lub FormClosed są podniesione, jeśli po prostu pozbędziesz się formularza, ale zostawię to tobie, abyś eksperymentował.

 5
Author: Reddog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-22 21:47:29

Używanie using jest całkiem dobrym sposobem:

using (MyForm foo = new MyForm())
{
    if (foo.ShowDialog() == DialogResult.OK)
    {
        // your code
    }
}
 0
Author: Burak Kalkan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-28 17:29:20