Come scopri quali risorse non sono gestite?

7

Esaminando la documentazione di .NET, in particolare la classe WebRequest , non vedo alcuna informazione che indichi che dovrei racchiudere una sua istanza in un'istruzione using . Anche l'esempio fornito non lo fa. Nella maggior parte degli esempi online, tuttavia, questo è esattamente ciò che è stato fatto.

La mia domanda è allora, come faccio a sapere in modo specifico quali classi devono essere smaltite? Esiste una regola generale o ispeziona le definizioni delle classi per vedere se gestiscono in qualche modo le risorse non gestite?

    
posta transporter_room_3 08.04.2015 - 23:53
fonte

4 risposte

9

My question is then, how do I know specifically which classes need to be disposed?

Implementa IDisposable ? Sì? Quindi deve essere smaltito. Se no, no. Potresti riuscire a farla franca in alcune app (C # e i moderni sistemi operativi in generale sono migliori per la pulizia dopo di te), ma è ancora sbagliato ®.

Ci sono pochissime classi di framework che hanno bisogno di Close (o qualcosa di simile) chiamato invece, e non implementano IDisposable , ma lo diranno nella loro documentazione. Questi però sono eccezioni.

    
risposta data 09.04.2015 - 00:27
fonte
2

In most examples online however, this is exactly what's done

Non sai come; né WebRequest né il suo concreto discendente HttpWebRequest in effetti implementano IDisposable , quindi questo

 using (System.Net.WebRequest wr = new System.Net.HttpWebRequest())
 {
     //What?
 }

non viene compilato . In realtà quello che trovo quando cerco su questo argomento è principalmente la speculazione sul perché WebRequest non implementa IDisposable ...

La documentazione MSDN non è assolutamente perfetta, ma fa ti dice quando una classe implementa IDisposable ; vedere ad esempio la sezione Note per StreamWriter .

    
risposta data 09.04.2015 - 10:09
fonte
-1

My question is then, how do I know specifically which classes need to be disposed?

È possibile esaminare la documentazione MSDN per ogni classe. Sarebbe noioso e ingombrante, ma funziona.

Se stai utilizzando una versione di Visual Studio che la supporta, devi attivare Static Code Analysis nelle opzioni del tuo progetto. Ti fornirà un avvertimento per ogni oggetto che non hai correttamente smaltito, sia attraverso un blocco di utilizzo che implementando un modello di smaltimento appropriato in caso di membri della classe.

    
risposta data 11.05.2015 - 07:11
fonte
-2

come faccio a sapere in modo specifico quali classi devono essere smaltite?

In breve, GC in Windows, alcuni potrebbero argomentare .NetFx , gestirà la gestione delle risorse e la sua durata nel sistema. In breve, non devi preoccuparti di gestirlo in .Net come fai nella sfera non gestita (C, C ++, ecc.)

In generale, gli oggetti che implementano IDisposable hanno la propensione a consumare grandi quantità di risorse (CPU, RAM, HDD, ecc.). Pertanto, lo sviluppatore ha deciso di estendere l'interfaccia IDisposable per fornire manualmente la logica per sbarazzarsi di quei maiali delle risorse.

Come punto di chiarimento, l'istruzione using è più una parola chiave zucchero sintattica per try...finally . Ci sono più coraggio e gloria dietro la logica dell'istruzione using ma tutto si riduce a try..finally ; come una parola di full-disclosure, using statement non implementa catch , questo è tutto per te.

Esiste una regola empirica generale o ispezioni le definizioni di classe per vedere se gestiscono in qualche modo risorse non gestite?

Ancora una volta, qualsiasi "oggetto" creato eredita di default Object . Ecco come .Net diventa efficacemente un'utilità gestita. Anche se non definisci un'ereditarietà esplicita su Object , il compilatore lo rende ereditario Object .

Le uniche risorse di cui devi preoccuparti sono le librerie non verificate di terze parti (DLL). Se provi ad allegarlo a un progetto .Net, urlerà "maledetto omicidio" a te finché non lo sistemerai correttamente.

    
risposta data 13.05.2018 - 01:51
fonte

Leggi altre domande sui tag