2010-02-17 10 views
17

Wenn ich eine Methode mit einem mit Block wie diese haben ...Was passiert, wenn 'return' innerhalb eines 'using' Blocks aufgerufen wird?

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

... dass der Wert aus der Verwendung von Block zurückkehrt, ist nach wie vor das IDisposable Objekt entsorgt werden?

+0

Siehe auch http://stackoverflow.com/questions/662773/returning-in-the-middle-of-a-using-block und http://stackoverflow.com/questions/1223865/best-practice-regarding -Returning-from-using-Blöcke –

+1

Überprüfen Sie Ihren generierten Code mit ILDASM oder Reflector. –

Antwort

28

Ja, tut es. Die Entsorgung des Objekts erfolgt in einem finally-Block, der auch bei einem Rückruf ausgeführt wird. Es dehnt sich im Wesentlichen aus dem folgenden Code

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

Von the MSDN documentation:

Die using-Anweisung stellt sicher, dass Entsorgen auch genannt wird, wenn eine Ausnahme auftritt, während Sie Methoden für das Objekt aufrufen. Sie können dasselbe Ergebnis erzielen, indem Sie das Objekt in einen try-Block setzen und dann Dispose in einem finally-Block aufrufen. Genau so wird die using-Anweisung vom Compiler übersetzt.

So ist das Objekt immer entsorgt. Es sei denn, Sie schließen das Netzkabel ab.

+11

"So ist das Objekt immer entsorgt. Es sei denn, Sie schließen das Netzkabel ab." - In diesem Fall wird das Objekt als die Elektronen verteilt ;-) – Nick

+1

Erinnert mich an diesen TheDailyWTF Artikel (der erste): http://thedailywtf.com/Articles/My-Tales.aspx –

+1

Aufruf Environment.FailFast wird rufen Sie nicht zusätzlich Dispose auf, um das Netzkabel zu ziehen. –