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;
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;
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:
return
dentro del bloqueBá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óntry
que incluye una cláusulafinally
. Esta cláusulafinally
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óntry
. Esto es cierto tanto si la transferencia de control ocurre como resultado de la ejecución normal; como resultado de ejecutar una declaraciónbreak
,continue
,goto
oreturn
; o como resultado de la propagación de una excepción de la declaracióntry
.
Sé que eres Jon Skeet, pero ¿puedes citar una referencia, por favor? :) –
@Louis: Imposible: toda la documentación hace referencia a Jon Skeet. – mdm
Agregué los enlaces a la documentación y un ejemplo de código. –
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á.
Creo que tan pronto como el control pasará de disponer {}
serán llamados por lo que en breve Yes
Sí, el uso es una característica del compilador, el cual se expande a
try {
...
return ...;
}
finally {
foo.Dispose();
}
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.
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.
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()). –