2011-06-15 8 views
6

Por ejemplo¿Se puede desechar un ID si el bloque que usa vuelve?

using(var something = GetSomething()) 
{ 
    something.DoSomething(); 
    if(something.IsX()) return true; 
} 
return false; 
+0

Hmm, esa es una pregunta interesante, estás haciendo un GetSomething() y no es un New Something. No creo que el marco tenga inteligencia para distinguir la diferencia. Si Something es un singleton, es posible que obtenga excepciones de "DisposedObject" después de salir. Puede crear una pequeña aplicación de prueba para averiguar qué hace el marco con un Uso (GetSomething()). –

Respuesta

8

Sí, absolutamente. Se llama al método Dispose, sin embargo, se ejecuta la instrucción using, a menos que fuera una terminación abrupta del proceso completo. Los casos más comunes son:

  • Un return dentro del bloque
  • se produce una excepción (y no capturado) dentro del bloque
  • Al llegar al final del bloque de forma natural

Básicamente, una using declaración es principalmente azúcar sintáctica para un bloque try/finally - y finally tiene todas las mismas propiedades.

EDIT: Desde la sección 8.13 del C# 4 specification:

Una declaración using se stranslated en tres partes: la adquisición, uso y disposición. El uso del recurso se incluye implícitamente en una declaración try que incluye una cláusula finally. Esta cláusula finally dispone del recurso.

La declaración finally se describe en la sección 8.10 de la especificación:

Los estados de un bloque de finally siempre se ejecutan cuando el control deja una declaración try. Esto es cierto tanto si la transferencia de control ocurre como resultado de la ejecución normal; como resultado de ejecutar una declaración break, continue, goto o return; o como resultado de la propagación de una excepción de la declaración try.

+1

Sé que eres Jon Skeet, pero ¿puedes citar una referencia, por favor? :) –

+5

@Louis: Imposible: toda la documentación hace referencia a Jon Skeet. – mdm

+0

Agregué los enlaces a la documentación y un ejemplo de código. –

0

Por lo que sé, el bloque de uso eliminará el objeto tan pronto como salga del alcance.

Por ejemplo, cuando se devuelve verdadero, la siguiente declaración está fuera del alcance, por lo que la variable se eliminará.

0

Creo que tan pronto como el control pasará de disponer {} serán llamados por lo que en breve Yes

1

Sí, el uso es una característica del compilador, el cual se expande a

try { 
    ... 
    return ...; 
} 
finally { 
    foo.Dispose(); 
} 
2

Sí.

using is syntactic sugar for a try/finally block:

La instrucción using asegura que Desechar se llama incluso si se produce una excepción mientras que está llamando métodos en el objeto.Puede lograr el mismo resultado colocando el objeto dentro de un bloque try y luego llamando al Dispose en un bloque finally;

In the documentation on the finally block:

Mientras que la captura se utiliza para manejar excepciones que se producen en un bloque de instrucciones , finalmente, se utiliza para garantizar un bloque declaración de código se ejecuta independientemente de la forma en la que precede a tratar bloque se sale.

Así, el using se traduce a try/finally, con .Dispose() en la parte finally, asegurando que siempre se ejecuta sin importar lo que suceda en el try/catch.

0

Un punto aún no mencionado es que mientras un "retorno" dentro de un bloque "usar" llamará Dispose sobre la variable controlada, un "rendimiento devuelto" dentro de un bloque "using" dentro de un iterador no Dispose the controlled variable a menos que el IEnumerator asociado con el iterador esté Disposed.

Cuestiones relacionadas