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?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()
lubApplication.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.
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.
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ł.
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
}
}
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