2010-02-17 6 views
17

Si j'ai une méthode avec un bloc en utilisant comme ça ...Que se passe-t-il lorsque 'return' est appelé depuis un bloc 'using'?

public IEnumerable<Person> GetPersons() 
    { 
     using (var context = new linqAssignmentsDataContext()) 
     { 
      return context.Persons.Where(p => p.LastName.Contans("dahl")); 
     } 
    } 

... qui renvoie la valeur à l'intérieur du bloc à l'aide, ne l'objet IDisposable obtenir toujours disposé?

+0

Voir aussi http://stackoverflow.com/questions/662773/returning-in-the-middle-of-a-using-block et http://stackoverflow.com/questions/1223865/best-practice-regarding -returning-from-using-blocks –

+1

Vérifiez votre code généré avec ILDASM ou Reflector. –

Répondre

28

Oui, c'est le cas. La disposition de l'objet se produit dans un bloc finally qui s'exécute même face à un appel de retour. Il se développe essentiellement sur le code suivant

var context = new linqAssignmentsDataContext(); 
try { 
    return context.Persons.Where(p => p.LastName.Contans("dahl")); 
} finally { 
    if (context != null) { 
    context.Dispose(); 
    } 
} 
6

De the MSDN documentation:

L'instruction à l'aide assure que Dispose est appelée même si une exception se produit pendant que vous appelez des méthodes sur l'objet. Vous pouvez obtenir le même résultat en plaçant l'objet dans un bloc try, puis en appelant Dispose dans un bloc finally; en fait, c'est ainsi que l'instruction using est traduite par le compilateur.

L'objet est donc toujours éliminé. Sauf si vous branchez le câble d'alimentation.

+11

"Donc, l'objet est toujours disposé, sauf si vous branchez le câble d'alimentation." - Dans ce cas, l'objet est disposé comme les électrons se dispersent ;-) – Nick

+1

Me rappelle cet article TheDailyWTF (le premier): http://thedailywtf.com/Articles/My-Tales.aspx –

+1

Appeler Environment.FailFast will N'appelez pas non plus Dispose en plus de tirer le câble d'alimentation. –