2010-02-17 29 views
17

Si tengo un método con un bloque usando como esto ...¿Qué sucede cuando se llama 'return' desde un bloque 'using'?

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

... que devuelve el valor desde el interior del bloque usando, ¿Tiene el objeto IDisposable aún así obtener dispuestos?

+0

Vea también http://stackoverflow.com/questions/662773/returning-in-the-middle-of-a-using-block y http://stackoverflow.com/questions/1223865/best-practice-regarding -returnning-from-using-blocks –

+1

Revisa tu código generado con ILDASM o Reflector. –

Respuesta

28

Sí lo hace. La eliminación del objeto se produce en un bloque finally que se ejecuta incluso ante una llamada de retorno. En esencia, se expande a cabo el siguiente código

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:

La instrucción using asegura que Desechar se llama incluso si se produce una excepción, mientras que la que está llamando a métodos en el objeto. Puede lograr el mismo resultado colocando el objeto dentro de un bloque try y luego llamando a Dispose en un bloque finally; de hecho, así es como el compilador traduce la sentencia using.

Por lo tanto, el objeto siempre se desecha. A menos que conecte el cable de alimentación.

+11

"Por lo tanto, el objeto siempre se desecha. A menos que desconecte el cable de alimentación". - En cuyo caso, el objeto se elimina cuando los electrones se dispersan ;-) – Nick

+1

Me recuerda a este artículo de TheDailyWTF (el primero): http://thedailywtf.com/Articles/My-Tales.aspx –

+1

Calling Environment.FailFast will tampoco llame a Dispose además de tirar del cable de alimentación. –

Cuestiones relacionadas