2015-10-30 32 views
5

Il PetaPoco.Database oggetto implementa IDisposable ma raramente, se mai vedere esempi di codice (anche per quanto riguarda di own website PetaPoco) che includono un utilizzo economico come segue:PetaPoco.Database implementa IDisposable, quindi perché la maggior parte degli esempi non ha un'istruzione 'using'?

using (var db = new Database("MyConnectionString")) 
{ 
    // Do database stuff 
} 

Il più delle volte ho semplicemente vedere:

var db = new Database("MyConnectionString"); 
// Do database stuff 
// I never see .Dispose() called. 

In che modo dovrebbero essere consegnati gli oggetti PetaPoco.Database?

+0

Se implementa IDisposable dovresti essere sicuro di chiamare Dispose. E, in ogni caso, non hai nulla da perdere se il metodo Dispose non fa nulla – Steve

+0

Ma se è implementato IDisposable, non dovrei inserirlo in un blocco "using", in quanto questo è in genere il significato di "using" essere usato? – Howiecamp

+0

@Howiecamp Lo è e dovresti. non lo fanno negli esempi perché GC si prende cura di esso quando il 'AppDomain' viene distrutto con il programma. – Behrooz

risposta

-2

IDisposable dice GC cosa fare quando si vuole sbarazzarsi di un object.
using richiede GC per liberarsi di un object quando il suo ambito termina.
utilizzando using con un object che non è IDisposable è inutile.

+0

Ma PetaPoco.Database * supporta * IDisposable. – Howiecamp

+0

@Howiecamp Questo non è contro quello che ho detto. vedi il mio altro commento sopra. Ho semplicemente affermato 3 punti. – Behrooz

+0

Ma poiché l'oggetto * fa * implementa IDisposable, qual è il punto del commento sull'utilizzo dell'uso con oggetti che * non * implementano IDisposable? – Howiecamp

0

Dipende da cosa stai implementando. Un oggetto Database è una connessione al database, non si desidera disporre la connessione ogni volta che si esegue un'istruzione SQL nel database perché le prestazioni saranno terribili.

Se si implementa una soluzione web based, in genere si utilizza un oggetto di database per ogni richiesta, ma tale richiesta sicuramente eseguire diverse istruzioni SQL in diversi filtri, filtri globali e nei metodi diversi controller, quindi non è possibile utilizzare Using

3

Come regola semplice: se una classe implementa IDisposable, procedi e avvolgila in un utilizzo. In realtà, potrebbero non utilizzare risorse non gestite, ma non danneggeranno e potrebbero essere a prova di futuro contro le modifiche.

+1

Non potrei essere più d'accordo! Tuttavia, alcune API utilizzano dispose per lo zucchero del synax, che se usato in questo modo, dovrebbe essere ben documentato. Aggiungerò una nota per aggiungere questo per PetaPoco. – Plebsori

1

Manutentore PetaPoco qui. Smaltire equivale a chiamare CloseSharedConnection(). Tuttavia, la sintassi C# supporta solo l'utilizzo (...) con IDisposable. Ad esempio, IDBConnection, dalla memoria, supporta sia Close sia Dispose.

Fondamentalmente, si riduce a scelta

Esempio 1

using(var db = new PetaPoco()) 
{ 
    // some code 
} 

Esempio 2

var db = new PetaPoco() 

try 
{ 
    // code 
} 
finally 
{ 
    db.CloseSharedConnection(); 
} 
0

GC chiama Object.Finalize. IDisposable non è chiamato da GC, deve essere chiamato manualmente. GC non ha nulla a che fare con using e IDisposable