C # 2008
Pracuję nad tym od dłuższego czasu i nadal jestem zdezorientowany co do użycia metod finalizacji i usuwania w kodzie. Moje pytania są poniżej:
Wiem, że potrzebujemy tylko finalizatora, który pozbywa się niezarządzanych zasobów. Jeśli jednak istnieją zasoby zarządzane, które wykonują połączenia z zasobami niezarządzanymi, czy nadal będzie musiał zaimplementować finalizator?
Jeśli jednak opracuję klasę, która nie korzysta z żadnego niezarządzanego zasobu - bezpośrednio lub pośrednio, czy powinienem zaimplementować
IDisposable
opcję, aby umożliwić klientom tej klasy korzystanie z „instrukcji using”?Czy byłoby możliwe zaimplementowanie IDisposable, aby umożliwić klientom twojej klasy korzystanie z instrukcji using?
using(myClass objClass = new myClass()) { // Do stuff here }
Opracowałem ten prosty kod poniżej, aby zademonstrować użycie finalizacji / usuwania:
public class NoGateway : IDisposable { private WebClient wc = null; public NoGateway() { wc = new WebClient(); wc.DownloadStringCompleted += wc_DownloadStringCompleted; } // Start the Async call to find if NoGateway is true or false public void NoGatewayStatus() { // Start the Async's download // Do other work here wc.DownloadStringAsync(new Uri(www.xxxx.xxx)); } private void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { // Do work here } // Dispose of the NoGateway object public void Dispose() { wc.DownloadStringCompleted -= wc_DownloadStringCompleted; wc.Dispose(); GC.SuppressFinalize(this); } }
Pytanie o kod źródłowy:
Tutaj nie dodałem finalizatora i zwykle finalizator zostanie wywołany przez GC, a finalizator wywoła Dispose. Ponieważ nie mam finalizatora, kiedy wywołać metodę Dispose? Czy to klient klasy musi to nazwać?
Tak więc moja klasa w tym przykładzie nazywa się NoGateway, a klient może użyć i usunąć klasę w następujący sposób:
using(NoGateway objNoGateway = new NoGateway()) { // Do stuff here }
Czy metoda Dispose byłaby wywoływana automatycznie, gdy wykonanie osiągnie koniec używanego bloku, czy też klient musi ręcznie wywołać metodę dispose? to znaczy
NoGateway objNoGateway = new NoGateway(); // Do stuff with object objNoGateway.Dispose(); // finished with it
Korzystam z
WebClient
klasy w mojejNoGateway
klasie. PonieważWebClient
implementujeIDisposable
interfejs, czy oznacza to, żeWebClient
pośrednio wykorzystuje niezarządzane zasoby? Czy istnieje twarda i szybka zasada, aby się do tego stosować? Skąd mam wiedzieć, że klasa korzysta z niezarządzanych zasobów?