2009-06-23 8 views
16

Mi chiedevo se ci fosse una sorta di cheat sheet per il quale gli oggetti vanno bene con l'istruzione using ... SQLConnection, MemoryStream, eccEsiste un elenco di oggetti comuni che implementano IDisposable per l'istruzione using?

Facendo un ulteriore passo avanti, sarebbe bello mostrare anche l'altra "pezzi del puzzle", come in realtà dovresti chiamare lo connection.Close() prima della chiusura usando la parentesi dell'istruzione.

C'è qualcosa del genere? Se no, forse dovremmo farne uno.

+0

Perché è necessario chiamare la connessione.Chiudi() prima della staffa finale? Non so che ci sono molti altri pezzi del puzzle. –

+0

Perché una lista? Puoi facilmente verificare se un oggetto implementa IDisposable. – Groo

+0

@Groo: Devi davvero controllare i documenti, alcuni tipi nascondono Dispose(). Quindi non così facile. –

risposta

10

Microsoft FxCop ha una regola che verifica l'utilizzo di un IDisposbale in un blocco di utilizzo.

1

Con ReSharper è possibile visualizzare tutti i tipi derivati. Forse puoi farlo anche con il browser degli oggetti senza ReSharper. Vai alla definizione dell'interfaccia e cerca "Mostra ereditari".

+0

Né conoscendo ReSharper, lo fa lavoro per le interfacce? Ed è a livello di progetto o potresti includere il GAC e altre cartelle? –

+0

Funziona per tutto e può includere gli assembly della libreria, inclusi quelli nel GAC. Puoi anche fare clic su un compito, e ti suggerirà un blocco usando se il tipo a cui è stato assegnato implementa IDisposable. –

4

Se non si è sicuri se una classe implementa IDisposable o meno, racchiuderlo in un blocco using indipendentemente. Se ottieni un errore di compilazione, rimuovilo. Perderai solo qualche secondo per digitare il tempo.

+0

È vero, funziona come un incantesimo. –

+1

Nella maggior parte dei casi, se esiste un metodo Dispose implementerà IDisposable. – weiqure

+0

@weiqure - ma non viceversa –

2

Un modo semplice per ottenere un elenco di tipi che implementano IDisposable è aprire crack Reflector, passare a System.IDisposable, espandere il nodo e quindi espandere il nodo "Tipi derivati".

Per essere sicuri che l'elenco sia completo, verificare che tutti gli assiemi che si stanno utilizzando siano stati "aperti" in Reflector.

7

Il seguente metodo C# elencherà tutti i tipi IDisposable trovati in un determinato gruppo. (Spazi dei nomi usati: Sistema, System.Collections.Generic, System.IO, System.Reflection)

static void PrintDisposableTypesFromFile(String path) 
    { 
    Assembly assembly = Assembly.LoadFrom(path); 
    foreach (Type type in assembly.GetTypes()) 
     if (type.GetInterface("IDisposable") != null) 
      Console.WriteLine(type.FullName); 
    } 

Il seguente metodo di C# si avvale della precedente per fare lo stesso per tutte le assemblee in una directory e le sue sottodirectory , per esempio "C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727":

static void PrintDisposableTypesFromDirectory(DirectoryInfo dir, bool warn) 
    { 
    foreach (FileInfo file in dir.GetFiles("*.dll")) 
    { 
     try 
     { 
      PrintDisposableTypesFromFile(file.FullName); 
     } 
     catch (Exception ex) 
     { 
      if (warn) 
      { 
       Console.Error.WriteLine(
       String.Format(
        "WARNING: Skipped {0}: {1}", 
        new object[] { file.FullName, ex.Message })); 
      } 
     } 
    } 
    // recurse 
    foreach (DirectoryInfo subdir in dir.GetDirectories()) 
     PrintDisposableTypesFromDirectory(subdir, warn); 

    } 

Non sono sicuro che l'elenco di tutti i prodotti monouso è molto utile, ma ho usato un codice simile a trovare altre cose interessanti come l'elenco completo delle codifiche di testo supportate dal framework .NET.

+0

+1 per sforzo, ma penso che sarebbe più semplice usare solo il reflector :) –

0

Un modo rapido & per verificare se un tipo implementa IDisposable è creare un'istanza di esso e verificare se l'istanza ha una funzione membro Dispose(). Se lo fa, puoi essere sicuro al 99% che implementa IDisposable.

3

In aggiunta alle altre risposte, si noti che una classe potrebbe implementare IDisposable ma non avere Dispose visualizzato nell'elenco intellisense.

class MyClass :IDisposable 
{ 
    void IDisposable.Dispose() 
    { 
     /* Stuff */ 
    } 
} 
2

Se si utilizza Visual Studio è possibile premere F12 su una dichiarazione del tipo che vi porterà ad una schermata di meta-dati o la definizione di classe (se hai il codice sorgente). Se le combinazioni di tasti sono diverse, fai clic con il pulsante destro del mouse e "vai alla definizione". Da lì puoi vedere cosa implementa una classe. Suggerisco di farlo per tutte le classi la prima volta che le incontri per avere un "feeling" per ciò che la classe può fare.

+2

Sì, ma non tutte le classi che implementano IDisposable lo implementano direttamente. Prendi DataTable ad esempio (che, a proposito, non è necessario Dispose ... ma questa è un'altra conversazione http://stackoverflow.com/questions/913228/should-i-dispose-dataset-and-datatable.) – Grinn

14

Forse un'occhiata al mio post su questo a http://www.lancemay.com/2010/01/idisposable-cheat-sheet/. Non sono sicuro che sia quello che stai cercando, ma in base alla domanda originale, sembra che lo sia.

+2

Cool ! Questo è esattamente quello che stavo cercando originariamente! –

+0

wow così tanti commenti, mentre questa è la risposta! grazie Lance! – aron

Problemi correlati