Utilizzare l'istruzione using
nel metodo chiamante, non il metodo che restituisce l'oggetto.
public void Caller()
{
using(DataSet ds = GetDataSet())
{
// code here
}
}
public DataSet GetDataSet()
{
// don't use a using statement here
return ds;
}
La dichiarazione using
è fondamentalmente lo stesso di fare questo:
DataSet ds = null;
try
{
// code here
}
finally
{
if(ds != null)
{
ds.Dispose();
ds = null;
}
}
Quindi, se si è utilizzato una dichiarazione using
in un metodo che dovrebbe restituire l'oggetto nella dichiarazione using
, sarebbe restituisce un oggetto Disposed (vale a dire flusso chiuso, dataset chiuso, ecc ...) che significa che alcuni degli oggetti interni potrebbero essere nulli o chiusi. In altre parole, tutte le risorse interne verrebbero eliminate, il che è lo scopo di implementare IDisposable in primo luogo. Se l'applicazione si basava su alcune di queste risorse interne per essere disponibili, ad esempio quando si utilizza un oggetto Stream, si genera un'eccezione.
Ricorda inoltre che non tutti i blocchi finally
sono scritti nello stesso modo. Ricordate, IDispoable è stato implementato per ripulire qualsiasi risorsa INTERNA e oggetti non gestiti. Tali risorse interne potrebbero non essere necessarie al di fuori dell'istruzione using
, quindi a volte è possibile utilizzare l'istruzione using
come potrebbe sembrare funzionare correttamente, ma non è consigliabile, e sicuramente non funzionerà con tutti gli oggetti. Se Microsoft ha deciso di modificare l'oggetto DataSet in una versione futura, eliminando qualcosa di vitale per l'applicazione, il codice funzionante improvvisamente smetterebbe di funzionare.
fonte
2012-08-05 11:23:56
Se si desidera restituire un oggetto, perché si desidera smaltirlo? –
@Mert - Voglio sapere qual è il danno? C'è qualche perdita nei dati? Ho verificato che va bene ... La mia domanda è - c'è qualcosa di non vantaggioso che mi manca? –
Hai verificato? Bello. Troppo poche persone effettivamente dimostrano il loro codice con metodi formali :) – Joey