Quale programma per evidenziare quali oggetti non eseguono la dispose od il close?

di il
12 risposte

Quale programma per evidenziare quali oggetti non eseguono la dispose od il close?

Ciao a tutti, vorrei chiedere se esiste un programma od un estensione visual studio che evidenzi i casi in cui nel codice manca la dispose o la close di un oggetto tipo "Stream" ,ovviamente il software dovrebbe essere in grado di riconoscere quando l'oggetto è dentro uno using che dietro le quinte esegue la dispose,grazie,ciao

12 Risposte

  • Re: Quale programma per evidenziare quali oggetti non eseguono la dispose od il close?

    surfernet ha scritto:


    Ciao a tutti, vorrei chiedere se esiste un programma od un estensione visual studio che evidenzi i casi in cui nel codice manca la dispose o la close di un oggetto tipo "Stream" ,ovviamente il software dovrebbe essere in grado di riconoscere quando l'oggetto è dentro uno using che dietro le quinte esegue la dispose,grazie,ciao
    In genere, quando uso una classe seguo la documentazione quindi so automaticamente il momento in cui questa necessita della chiamata del metodo Dispose, ossia implementa IDisposable, anche perché spesso basta pensare semplicemente alla tipologia di risorsa che si sta usando.

    Credo che questa sia la pratica migliore da introitare e applicare.

    Se proprio non è possibile, si può ricorrere a una estensione, tipo DisposableFixer (ma so che ce ne sono tante altre, a volte nascoste all'interno di tool più grandi con altre funzionalità).

    Ciao!
  • Re: Quale programma per evidenziare quali oggetti non eseguono la dispose od il close?

    L'ipotesi era quella di utilizzare codice scritto da altri e quindi dargli una controllata , grazie della risposta ,ciao
  • Re: Quale programma per evidenziare quali oggetti non eseguono la dispose od il close?

    Il concetto di dispose e del garbage collection e' poco chiaro anche a me...
    Penso che tutti gli oggetti che derivano dalla classe seguano re regole dello stato appena finisce lo stato in cui la variabile si trova.
    la memoria assegnata viene rilasciata

    Tutti gli oggetti eseguono il dispone prima o poi....
  • Re: Quale programma per evidenziare quali oggetti non eseguono la dispose od il close?

    GianmarcoInFossa ha scritto:


    Il concetto di dispose e del garbage collection e' poco chiaro anche a me...
    Esponi cosa non ti è chiaro e sicuramente ci sarà modo di approfondire: purché si rimanga "in topic", credo che il forum sia fatto apposta.

    GianmarcoInFossa ha scritto:


    Penso che tutti gli oggetti che derivano dalla classe seguano re regole dello stato appena finisce lo stato in cui la variabile si trova.
    la memoria assegnata viene rilasciata
    Questa frase invece non è chiarissima a me. Cosa intendi?

    GianmarcoInFossa ha scritto:


    Tutti gli oggetti eseguono il dispone prima o poi....
    Direi che è proprio questo il punto: anche se per tutti gli oggetti prima o poi il "Dispose" viene fatto, per alcuni tipi di oggetto è assolutamente essenziale farlo prima, o il prima possibile, senza attendere il "poi".
  • Re: Quale programma per evidenziare quali oggetti non eseguono la dispose od il close?

    GianmarcoInFossa ha scritto:


    Il concetto di dispose e del garbage collection e' poco chiaro anche a me...
    Esponi cosa non ti è chiaro e sicuramente ci sarà modo di approfondire: purché si rimanga "in topic", credo che il forum sia fatto apposta.

    Alka ha scritto:


    GianmarcoInFossa ha scritto:


    Penso che tutti gli oggetti che derivano dalla classe seguano re regole dello stato appena finisce lo stato in cui la variabile si trova.
    la memoria assegnata viene rilasciata
    Questa frase invece non è chiarissima a me. Cosa intendi?
    {/Quote]


    Se inizializzo creo un oggetto dentro un qualsia blocco di codice {blocco}
    { //inizio di uno stato di memoria
    var x = new oggetto(): // qua' il compilatore alloca la memoria necessaria per x
    ...
    ...
    } // fine dello stato di memoria

    // Usciti dal blocco e quindi chiuso lo stato di memoria viene fatto il garbage collection , la memoria puntata da x viene liberata
    // mi sono piegato bene ?

    Alka ha scritto:


    GianmarcoInFossa ha scritto:


    Tutti gli oggetti eseguono il dispone prima o poi....
    Direi che è proprio questo il punto: anche se per tutti gli oggetti prima o poi il "Dispose" viene fatto, per alcuni tipi di oggetto è assolutamente essenziale farlo prima, o il prima possibile, senza attendere il "poi".
    Sarebbe ottima norma usare sempre il comando
    using ( oggetto ) { ... } // anche se io mai usato come comando...
    volevo dire un altra cosa... ma se il dipose viene fatto automanticamente per tutti gli oggetti dal compilatore
    come mai vi e' la possibilita' di implementarlo in una classe ??

    class MyClass: IDisposable
    {
    public void Dispose()
    {
    // a cosa serve implementare il dispose se viene fatto automaticamente?
    }
    }
  • Re: Quale programma per evidenziare quali oggetti non eseguono la dispose od il close?

    GianmarcoInFossa ha scritto:


    Il concetto di dispose e del garbage collection e' poco chiaro anche a me...
    Esponi cosa non ti è chiaro e sicuramente ci sarà modo di approfondire: purché si rimanga "in topic", credo che il forum sia fatto apposta.


    GianmarcoInFossa ha scritto:


    Penso che tutti gli oggetti che derivano dalla classe seguano re regole dello stato appena finisce lo stato in cui la variabile si trova.
    la memoria assegnata viene rilasciata
    Questa frase invece non è chiarissima a me. Cosa intendi?

    GianmarcoInFossa ha scritto:



    Se inizializzo creo un oggetto dentro un qualsia blocco di codice {blocco}
    { //inizio di uno stato di memoria
    var x = new oggetto(): // qua' il compilatore alloca la memoria necessaria per x
    ...
    ...
    } // fine dello stato di memoria

    // Usciti dal blocco e quindi chiuso lo stato di memoria viene fatto il garbage collection , la memoria puntata da x viene liberata
    // mi sono piegato bene ?

    Alka ha scritto:


    GianmarcoInFossa ha scritto:


    Tutti gli oggetti eseguono il dispone prima o poi....
    Direi che è proprio questo il punto: anche se per tutti gli oggetti prima o poi il "Dispose" viene fatto, per alcuni tipi di oggetto è assolutamente essenziale farlo prima, o il prima possibile, senza attendere il "poi".

    GianmarcoInFossa ha scritto:


    Sarebbe ottima norma usare sempre il comando
    using ( oggetto ) { ... } // anche se io mai usato come comando...
    volevo dire un altra cosa... ma se il dipose viene fatto automanticamente per tutti gli oggetti dal compilatore
    come mai vi e' la possibilita' di implementarlo in una classe ??

    class MyClass: IDisposable
    {
    public void Dispose()
    {
    // a cosa serve implementare il dispose se viene fatto automaticamente?
    }
    }
    sono nuovo del forum ....tutto tranne che un professionista
    ho mille curiosita' spero di non disturbare con qualche bomba
    Mi sono spiegato bene?
  • Re: Quale programma per evidenziare quali oggetti non eseguono la dispose od il close?

    GianmarcoInFossa ha scritto:


    Se inizializzo creo un oggetto dentro un qualsia blocco di codice {blocco}
    { //inizio di uno stato di memoria
    var x = new oggetto(): // qua' il compilatore alloca la memoria necessaria per x
    ...
    ...
    } // fine dello stato di memoria
    Intanto, dovrebbe essere new Classe() e non new oggetto(): l'oggetto - o istanza - è quella che ottieni usando new a cui fa seguito il nome della classe.

    Con quella istruzione, viene allocata la memoria necessaria per i dati dell'oggetto (nello spazio chiamato "heap"), mentre la variabile "x" è allocata sullo stack per le dimensioni minime necessarie a conservare il puntatore alla struttura che contiene i dati dell'oggetto, e che si trova appunto nell'heap.

    GianmarcoInFossa ha scritto:


    // Usciti dal blocco e quindi chiuso lo stato di memoria viene fatto il garbage collection , la memoria puntata da x viene liberata
    // mi sono piegato bene ?
    No. Usciti dal blocco di codice, la variabile "x" esce dallo scope e quindi non è più utilizzabile. Questo fa sì che l'oggetto a cui puntava la variabile "x" non abbia più riferimenti (a meno che questi non siano stati salvati da qualche parte, ad esempio in una lista o un array, restituendoli magari come valori di ritorno o dichiarandoli come campi, in breve prolungando loro la vita).

    Quando un oggetto non ha più riferimenti attivi, l'oggetto stesso è candidabile per essere distrutto, ossia il GC provvede (quando lo ritiene opportuno) a rilasciare la memoria occupata dall'oggetto.

    Il rilascio della memoria è un aspetto, ma ne esistono anche altri: ad esempio, una connessione a un DB deve implementare IDisposable e all'interno del metodo Dispose() chiudere fisicamente la connessione al database (es. socket); il metodo va invocato il prima possibile in modo da rilasciare la connessione fisica aperta sul DB anche prima che passi il GC a liberare la memoria dell'oggetto, chiamando Dispose() (se non è stato già fatto).

    Nella documentazione in linea comunque tutte queste particolarità sono spiegate in modo approfondito e con un discreto numero di esempi. Vi sono poi un sacco di articoli online che ne parlano e suggeriscono strategie da adottare in questi scenari.

    Ciao!
  • Re: Quale programma per evidenziare quali oggetti non eseguono la dispose od il close?

    Secondo me stiamo confondendo due argomenti distinti ma collegati ad IDisposable:
  • Re: Quale programma per evidenziare quali oggetti non eseguono la dispose od il close?

    PiGi78 ha scritto:


    Secondo me stiamo confondendo due argomenti distinti ma collegati ad IDisposable [...]
    No, diciamo che mi sono espresso malissimo e ho scritto un po' di fretta mentre stavo gestendo un'altra cosa, e questo non ha contribuito alla bontà della risposta.

    Direi che, per quanto mi riguarda, hai riassunto più che perfettamente quello che di saliente c'è da dire sulla questione.
  • Re: Quale programma per evidenziare quali oggetti non eseguono la dispose od il close?

    Grazie ragazzi grazie a entrambi.. da parte mio l argomento GC non l ho mai approfondito...
    mi sta rientrando in occhio ultmiamante con tutte queste risorse esterne
    grazie a tutti
  • Re: Quale programma per evidenziare quali oggetti non eseguono la dispose od il close?

    Sul dispose mi sono documentato

    Il metodo viene eseguito dal gestore della memoria quando ritiene che l oggetto non è più utile
  • Re: Quale programma per evidenziare quali oggetti non eseguono la dispose od il close?

    Non ne sono sicuro al 100% ma può essere.

    So che il GC di solito richiama il finalizer (metodo con lo stesso nome del costruttore ma con la tilde/bisciolina davanti).

    Ad ogni modo non è questo il motivo per cui si implementa IDisposable!
    Come detto in precedenza, il GC gira tecnicamente "quando gli pare", per cui non sappiamo se rilascerà subito le risorse o dopo delle ore.
    Pertanto, quando usiamo risorse importanti (connessioni, accesso ai file, ...) dobbiamo assicurarci di rilasciarle appena possibile, non quando ne ha voglia il GC.

    Pertanto le linee guida sono:
    • Implementare la IDisposable
    • Scrivere del codice che usi la IDisposable chiamando il metodo Dispose o, ancora meglio, usando la clausola "using"
    Nessuno è obbligato a seguire queste linee guida, però ti consiglio VIVAMENTE di farlo
Devi accedere o registrarti per scrivere nel forum
12 risposte