C # 2008
Ci sto lavorando da un po 'di tempo, e sono ancora confuso sull'uso di finalizzare e disporre i metodi nel codice. Le mie domande sono di seguito:
So che abbiamo solo bisogno di un finalizzatore quando disponiamo di risorse non gestite. Tuttavia, se ci sono risorse gestite che effettuano chiamate a risorse non gestite, dovrebbe comunque implementare un finalizzatore?
Tuttavia, se sviluppo una classe che non utilizza alcuna risorsa non gestita, direttamente o indirettamente, dovrei implementare il
IDisposable
per consentire ai clienti di quella classe di utilizzare la "dichiarazione using"?Sarebbe possibile implementare IDisposable solo per consentire ai clienti della tua classe di utilizzare l'istruzione using?
using(myClass objClass = new myClass()) { // Do stuff here }
Ho sviluppato questo semplice codice di seguito per dimostrare l'uso di Finalize / dispose:
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); } }
Domanda sul codice sorgente:
Qui non ho aggiunto il finalizzatore e normalmente il finalizzatore verrà chiamato dal GC e il finalizzatore chiamerà Dispose. Dato che non ho il finalizzatore, quando chiamo il metodo Dispose? È il client della classe che deve chiamarlo?
Quindi la mia classe nell'esempio si chiama NoGateway e il client potrebbe usare e smaltire la classe in questo modo:
using(NoGateway objNoGateway = new NoGateway()) { // Do stuff here }
Il metodo Dispose verrebbe automaticamente chiamato quando l'esecuzione raggiunge la fine del blocco using o il client deve chiamare manualmente il metodo dispose? vale a dire
NoGateway objNoGateway = new NoGateway(); // Do stuff with object objNoGateway.Dispose(); // finished with it
Sto usando la
WebClient
classe nella miaNoGateway
classe. PerchéWebClient
implementa l'IDisposable
interfaccia, questo significa cheWebClient
utilizza indirettamente risorse non gestite? C'è una regola dura e veloce da seguire? Come faccio a sapere che una classe utilizza risorse non gestite?