2010-07-03 18 views
17

Sto imparando a disegnare cose in C# e continuo a vedere consigli per usare dispose(), ma non capisco cosa faccia.Quando devo usare dispose() nella grafica?

  • Quando dovrei usare dispose() su un grafico disegnato da codice ?
  • Cosa succede se I no?
  • Devo chiamarla ogni volta che un grafico non è visibile, come ad come su una GUI che ha schede e l'utente commutato all'altra scheda, e quindi ridisegna quando si passa indietro?
  • Rompendo le cose se lo chiamo quando non dovrei?
  • Will Batman sfugge alle cattive grinfie del Joker?

risposta

27
  • Quando dovrei usare smaltire() su un grafico in codice disegnato? Ogni volta che hai finito con qualsiasi oggetto che implementa IDisposable, dovresti chiamare Dispose poco prima che diventi idoneo per la garbage collection. Come altri hanno sottolineato, è preferibile utilizzare l'istruzione using invece di chiamare direttamente Dispose.
  • Cosa succede se non lo faccio? Il tuo programma sarà leggermente meno efficiente perché richiederà un po 'più risorse del necessario. Questo è l'unico inconveniente di non disporre della grafica ; tuttavia, non disporre altre classi può effettivamente causare errori (un esempio famoso è StreamWriter). Per questo motivo, è preferibile disporre sempre di una classe che implementa IDisposable, come regola generale.
  • Devo chiamarlo ogni volta che un'immagine non è visibile, ad esempio su una GUI con schede e l'utente passa all'altra scheda e quindi ridisegnarla quando si torna indietro? No. Gli oggetti devono essere eliminati solo quando si è completamente finiti con essi.
  • Romperò le cose se lo chiamo quando non dovrei? Sì. Se si chiama Dispose prima di aver finito con l'oggetto, e quindi si tenta di utilizzare l'oggetto disposto, si otterrà un ObjectDisposedException.
  • Batman sarà sottratto alle cattive grinfie del Joker? Sintonizzati domani, stessa bat-time, stesso bat-channel!
+17

Questo ha bisogno di un'altra regola: do * not * dispose un oggetto che non hai creato. Smaltire e.Graphics è un brutto bug latente. –

+1

Solo una nota per 'Graphics' in particolare, se è stata eliminata chiamando i suoi metodi' Draw ... 'darà un' InvalidArgumentException' con il messaggio 'il parametro non è valido' - non 'ObjectDisposedException'. –

0

Mitch Wheat says - Chiamare sempre Dispose() su qualsiasi oggetto che implementa IDisposable. Gli handle GDI usati dagli oggetti grafici non sono gestiti e richiedono lo smaltimento una volta terminati.

5

Quando si chiede un oggetto grafico, Windows assegna un po 'di memoria per te. Chiamare lo smaltimento ti farà riordinare quel ricordo. Se non si chiama dispose, tutte queste maniglie in memoria rimarranno aperte e alla fine il sistema esaurirà le risorse, rallenterà e alla fine si fermerà (la chiusura del programma potrebbe tuttavia renderle gratuite).

Poiché stai utilizzando .NET, quando hai finito di usare l'oggetto grafico, il garbage collector chiamerà per te. Il problema con il garbage collector non si sa mai quando pulirà l'oggetto, quindi potrebbe lasciare queste risorse aperte più a lungo del necessario.

Detto questo, non si dovrebbe mai chiamare il telefono. Molto meglio sarà quello di mettere il vostro oggetto nel usando portata:

using(Graphics g) 
{ 
    // do something with the resource 
} 

Ora, quando si lascia questo utilizzando ambito, l'oggetto sarà distrutto e smaltire si chiamerà automaticamente per voi. Dovresti mettere tutti gli oggetti che hanno il metodo di smaltimento definito all'interno di un ambito di utilizzo.

3

In noob speak, Dispose() riguarda la pulizia dopo aver finito di utilizzare una risorsa non gestita.

Che cos'è una risorsa non gestita? Sono tutto ciò che CLR non gestisce per te. Sono cose come handle di file, connessioni al database, socket di rete, penne GDI +, ecc. Si ottiene l'accesso a queste cose tramite un tipico oggetto .NET, ma implementerà IDisposable, per consentire di ripulire correttamente.

Perché pulire? Fino a quando non hai ripulito te stesso, quella risorsa non è disponibile per altre parti del programma. In questo senso, stai rompendo le cose, perché stai hogging su una risorsa.

Perché farlo da soli? Dovresti farlo da solo non appena smetti di aver bisogno della risorsa, piuttosto che affidarti alla magia automatica del garbage collector, perché potrebbe richiedere una lunga (ben, non specificata) quantità di tempo prima che il garbage collector arrivi ad esso. Finché un oggetto non è stato smaltito correttamente, non è possibile riutilizzare la risorsa sottostante, quindi il programma non funzionerà in modo affidabile.