Jestem nowy w C # i próbowałem spojrzeć na wcześniejsze posty, ale nie znalazłem dobrej odpowiedzi.
Czy w aplikacji formularza systemu Windows w języku C # z pojedynczym formularzem jest używany Form.Close()
lepszy lub Form.Dispose()
?
MSDN mówi, że wszystkie zasoby w obiekcie są zamknięte, a formularz jest usuwany po wywołaniu Close. Mimo to natknąłem się na kilka przykładów w Internecie, które podążają za rozporządzeniem, a nie zamknięciem.
Czy jeden ma przewagę nad drugim? W jakich scenariuszach powinniśmy preferować jeden nad drugim?
form.Visible = false;
, możesz zadzwonićform.Hide()
. W rzeczywistościform.Hide()
po prostu ustawiathis.Visible = false;
.Odpowiedzi:
Informacje na tym forum w witrynie MSDN.
źródło
Zasadniczo zawsze zalecałbym jawne wywoływanie metody Dispose dla dowolnej klasy, która ją oferuje, albo przez bezpośrednie wywołanie metody, albo poprzez umieszczenie w bloku „using”.
Najczęściej klasy implementujące IDisposible robią to, ponieważ opakowują niezarządzany zasób, który należy zwolnić. Chociaż te klasy powinny mieć finalizatory, które działają jako zabezpieczenie, wywołanie Dispose pomoże zwolnić tę pamięć wcześniej i przy niższym narzucie.
W przypadku obiektu Form, jak zauważył odsyłacz do Kyry, udokumentowano, że metoda Close wywołuje Dispose w twoim imieniu, więc nie musisz tego robić jawnie. Jednak zawsze wydawało mi się, że poleganie na szczegółach implementacji. Wolę zawsze wywoływać zarówno Close, jak i Dispose dla klas, które je implementują, w celu ochrony przed zmianami / błędami implementacji i ze względu na przejrzystość. Prawidłowo zaimplementowana metoda Dispose powinna być bezpieczna do wielokrotnego wywoływania.
źródło
Niewywołanie
Close
prawdopodobnie omija wysyłanie kilku wiadomości Win32, które wydaje się być dość ważne, chociaż nie mogłem dokładnie powiedzieć, dlaczego ...Close
ma tę zaletę, że podnosi zdarzenia (które można anulować) tak, aby osoba postronna (do formularza) mogła obserwowaćFormClosing
iFormClosed
odpowiednio reagować.Nie jestem pewien, czy
FormClosing
i / lubFormClosed
zostaną podniesione, jeśli po prostu pozbędziesz się formularza, ale zostawię to Tobie do eksperymentowania.źródło
Używanie
using
to całkiem dobry sposób:using (MyForm foo = new MyForm()) { if (foo.ShowDialog() == DialogResult.OK) { // your code } }
źródło
Close () - zarządzany zasób można tymczasowo zamknąć i ponownie otworzyć.
Dispose () - trwale usuwa zarządzany lub nie zarządzany zasób
źródło
ShowDialog()
. W przeciwnym razieClose()
usunie również formularz.Jeśli użyjesz form.close () w swoim formularzu i ustawisz zdarzenie FormClosing swojego formularza i albo użyjesz form.close () w tym zdarzeniu, wpadniesz w nieograniczoną pętlę i wystąpił argument argument poza zakresem, a rozwiązaniem jest zmiana formularza .close () z form.dispose () w przypadku zamknięcia formularza. Mam nadzieję, że ta mała wskazówka ci pomoże !!!
źródło
To, co właśnie eksperymentowałem z narzędziami diagnostycznymi VS, to nazwałem this.Close (), a następnie wyzwolono zdarzenie formclosing. Następnie, kiedy wywołuję this.Dispose () na końcu zdarzenia Formclosing, w którym pozbywam się wielu innych obiektów, czyści wszystko znacznie płynniej.
źródło