Patrzę na jakiś kod i ma to stwierdzenie:
~ConnectionManager()
{
Dispose(false);
}
Klasa implementuje IDisposable
interfejs, ale nie wiem, czy jest to część tego, do czego służy tylda (~).
Patrzę na jakiś kod i ma to stwierdzenie:
~ConnectionManager()
{
Dispose(false);
}
Klasa implementuje IDisposable
interfejs, ale nie wiem, czy jest to część tego, do czego służy tylda (~).
Odpowiedzi:
~ jest destruktorem
Sfinalizować
W języku C # metoda Finalize wykonuje operacje, które mógłby wykonać standardowy destruktor C ++. W C # nie nadajesz jej nazwy Finalize - używasz składni destruktora C ++ polegającej na umieszczeniu symbolu tyldy (~) przed nazwą klasy.
Dysponować
Zaleca się usuwanie obiektów w metodzie Close()
lub Dispose()
, którą może wywołać jawnie użytkownik klasy. Finalize (destructor) są wywoływane przez GC.
IDisposable interfejs mówi światu, że klasa posiada na zasobach, które muszą być usunięte i zapewnia użytkownikom możliwość ich uwolnienia. Jeśli musisz zaimplementować finalizator w swojej klasie, metoda Dispose powinna używać GC.SuppressFinalize()
metody, aby upewnić się, że finalizacja wystąpienia jest pomijana.
Czego używać?
Jawne wywołanie destruktora jest nielegalne. Twój destruktor zostanie wywołany przez śmieciarza. Jeśli masz do czynienia z cennymi niezarządzanymi zasobami (takimi jak uchwyty plików), które chcesz zamknąć i pozbyć się tak szybko, jak to możliwe, powinieneś zaimplementować interfejs IDisposable.
Finalize
metoda jest wywoływana rekurencyjnie dla wszystkich instancji w łańcuchu dziedziczenia, od najbardziej do najmniej wyprowadzonych” . Pamiętaj jednak, że to nie to samo zachowanie, które można uzyskać z dziedzicznych destruktorów.
To jest finalizator . Szczerze mówiąc, bardzo rzadko trzeba będzie pisać finalizator. Naprawdę musisz napisać tylko, jeśli:
IntPtr
) i nie możesz z niego korzystać, SafeHandle
co ułatwiaIDisposable
w klasie, która nie jest zapieczętowana. (Wolę zapieczętować klasy, chyba że są przeznaczone do dziedziczenia). W takich przypadkach finalizator jest częścią kanonicznego wzorca Dispose.Służy do wskazania destruktora dla klasy.
try/finally
blok, który zapewnia Finalize
wywołanie metody nadrzędnej . Większość rzeczy, które są prawdziwe w przypadku destruktorów, dotyczy finalizatorów i odwrotnie, ale słowa te mają nieco inne znaczenie.
Tak samo jak C ++, jest to destruktor; jednak w C # nie jest to wywoływane jawnie, jest wywoływane, gdy obiekt zostanie zebrany.
Zobacz destruktory (przewodnik programowania w języku C #) . Należy jednak pamiętać, że w przeciwieństwie do C ++ programista nie ma kontroli nad wywołaniem destruktora, ponieważ jest to określane przez moduł odśmiecania pamięci.
~ zwykle reprezentuje dekonstruktora. który jest uruchamiany tuż przed śmiercią obiektu.