Ta niedoszła szybka rada stała się długą odpowiedzią. Przepraszam.
Jak zauważył Tyler w swojej miłej odpowiedzi, dzwonienie Dispose()jest świetną praktyką programistyczną. Dzieje się tak, ponieważ ta metoda ma „zebrać razem” wszystkie potrzebne zasoby, aby uwolnić zasoby, aby nie było niepotrzebnych otwartych zasobów. Jeśli na przykład napisałeś jakiś tekst do pliku i nie udało ci się zamknąć pliku (zwolnić zasób), pozostanie on otwarty i nikt inny nie będzie mógł do niego pisać, dopóki nie pojawi się GC i nie zrobi tego, co powinieneś był Gotowe.
Teraz, w niektórych przypadkach, będą "finalizujące" metody bardziej specyficzne dla klasy, z którą masz do czynienia, na przykład StreamWriter.Close(), która przesłania TextWriter.Close(). Rzeczywiście, są one zwykle bardziej dostosowane do sytuacji: Close()na przykład StreamWriter opróżnia strumień i bazowy koder przed Dispose()rozpoczęciem obiektu! Chłodny!
Jednak przeglądając MSDN zauważysz, że nawet Microsoft jest czasami zdezorientowany mnogością zamykaczy i urządzeń usuwających. Na przykład na tej stronie internetowej w niektórych przykładach Close()jest wywoływana przed niejawnym Dispose()(zobacz using instrukcję, jeśli nie rozumiesz, dlaczego jest niejawna), aw jednym szczególnie nie przeszkadzają. Dlaczego miałoby to być? Ja też byłem zakłopotany.
Doszedłem do wniosku (i podkreślam, że są to oryginalne badania i na pewno mogę stracić reputację, jeśli się mylę), że Close()może się nie powieść, dając wyjątek, pozostawiając otwarte zasoby, a jednocześnie Dispose()z pewnością je uwolni . Dlatego należy zawsze zabezpieczyć się rozmowy (przepraszam za kalambur).Dispose()Close()
MyResource r = new MyResource();
try {
r.Write(new Whatever());
r.Close()
finally {
r.Dispose();
}
I tak, myślę, że Microsoft poślizgnął się na tym jednym przykładzie. Być może ta sygnatura czasowa nigdy nie zostanie pobrana do pliku.
Jutro poprawiam stary kod.
Edycja: przepraszam Brannon, nie mogę skomentować Twojej odpowiedzi, ale czy na pewno warto zadzwonić Close()na finallyblok? Myślę, że wyjątek od tego może zrujnować resztę bloku, który prawdopodobnie zawiera ważny kod czyszczący.
Odpowiedź Brannona: świetnie, po prostu nie zapomnij zadzwonić, Close()gdy jest to naprawdę potrzebne (np. W przypadku strumieni - nie wiem zbyt wiele o połączeniach SQL w .NET).