Algo como:
using (IDisposable disposable = GetSomeDisposable())
{
//.....
//......
return Stg();
}
Creo que no es un lugar adecuado para una declaración de devolución, ¿verdad?
Algo como:
using (IDisposable disposable = GetSomeDisposable())
{
//.....
//......
return Stg();
}
Creo que no es un lugar adecuado para una declaración de devolución, ¿verdad?
Como varios otros han señalado en general, esto no es un problema.
El único caso que le causará problemas es si regresa en medio de una declaración de uso y, adicionalmente, devuelve la variable de uso de. Pero, de nuevo, esto también le causaría problemas, incluso si no regresó y simplemente mantuvo una referencia a una variable.
using ( var x = new Something() ) {
// not a good idea
return x;
}
Igual de malo
Something y;
using ( var x = new Something() ) {
y = x;
}
return
declaración hace que el final delusing
bloque sea inaccesible para cualquier ruta de código. El final delusing
bloque debe ejecutarse para que el objeto pueda eliminarse si es necesario.Está perfectamente bien
Aparentemente estás pensando que
se traduce ciegamente a:
Lo cual, sin duda, sería un problema y haría que la
using
afirmación sea bastante inútil, razón por la cual eso no es lo que hace.El compilador se asegura de que el objeto esté dispuesto antes de que el control abandone el bloque, independientemente de cómo lo abandone.
fuente
Está absolutamente bien, no hay problema en absoluto. ¿Por qué crees que está mal?
Una declaración de uso es solo azúcar sintáctico para un bloque try / finalmente, y como Grzenio dice que está bien regresar también de un bloque try.
Se evaluará la expresión de retorno, luego se ejecutará el bloque finalmente y luego se devolverá el método.
fuente
Esto funcionará perfectamente bien, al igual que volver en medio de
try{}finally{}
fuente
Eso es totalmente aceptable. Una instrucción de uso garantiza que el objeto IDisposable se eliminará sin importar qué.
De MSDN :
fuente
El siguiente código muestra cómo
using
funciona:Salida:
Los eliminados se invocan después de la declaración de devolución pero antes de la salida de la función.
fuente
Quizás no sea 100% cierto que esto sea aceptable ...
Si sucede que está anidando usos y regresando de uno anidado, puede que no sea seguro.
Toma esto como un ejemplo:
Estaba pasando una DataTable para que se muestre como csv. Con el retorno en el medio, estaba escribiendo todas las filas en la secuencia, pero al csv de salida siempre le faltaba una fila (o varias, dependiendo del tamaño del búfer). Esto me dijo que algo no se estaba cerrando correctamente.
La forma correcta es asegurarse de que todos los usos anteriores se eliminen correctamente:
fuente