2009-06-23 7 views

risposta

26

Il primo è meglio. Assicura che venga eliminato anche se viene generata un'eccezione e gestisce correttamente il caso in cui Create(0) restituisce null (ovvero non tenta di chiamare Dispose() in un'istanza null).

+0

Grazie! Era solo il tipo di risposta che stavo cercando. – mkelley33

+11

Un ulteriore punto secondario che nessuno ha menzionato è che l'uso di "using" impedisce di mutare accidentalmente il contenuto della variabile "ctx" dopo la sua inizializzazione ma prima della sua eliminazione. Non vuoi disporre accidentalmente di un oggetto diverso da quello che hai creato. –

2

L'istruzione using offre una buona sintassi e una protezione dalle eccezioni. Non puoi lasciare l'istruzione using senza chiamare Dispose (si traduce in un blocco finale con una chiamata da eliminare). Nel tuo secondo scenario, se avessi un'eccezione tra Crea e Dispose, non chiameresti direttamente. Quale non è un problema a meno che stiate usando le risorse non gestite, ma se siete, fuoriuscirete.

3

Dove è possibile, utilizzare using per i motivi indicati da Marc. OTOH non è una soluzione cerebrale, perché a volte la vita dell'oggetto non può essere definita come un ambito lessicale, quindi usarla in modo ragionevole.

3

L'unico punto in cui non si desidera utilizzare un blocco utilizzando è il punto in cui l'oggetto monouso è impostato all'esterno della funzione. In questo caso, la classe deve implementare IDisposable e disporre dell'oggetto nel suo Dispose().

+0

Ho incontrato casi in cui la durata dell'oggetto è inferiore alla durata del proprietario. – BCS

7

Un using affermazione è sempre meglio perché ...

  • non si può dimenticare di chiamare Dispose(), anche se il codice si evolve in differenti percorsi di codice
  • Dispose() viene chiamato anche se c'è un'eccezione. Controlla anche per null prima di chiamare Dispose(), che può essere utile (supponendo che non stai chiamando solo new).

One non ovvia (per me, comunque) trucco con using è come si può evitare l'annidamento eccessiva quando si dispone di più oggetti usa e getta:

using (var input = new InputFile(inputName)) 
using (var output = new OutputFile(outputName)) 
{ 
    input.copyTo(output); 
} 

Il codice di formattazione VS lascerà le due affermazioni di partenza nella stessa colonna


Infatti, in alcune situazioni che non hanno nemmeno bisogno di ripetere l'istruzione using ...

using (InputFile input1 = new InputFile(inputName1), input2 = new InputFile(inputName2)) 

Tuttavia, le restrizioni per dichiarare più variabili sulla stessa linea si applica qui in modo che il i tipi devono essere uguali e non è possibile utilizzare il tipo implicito var.