Devolver un valor de método desde el interior de una instrucción de uso que obtiene un DataContext parece funcionar siempre bien , así:
public static Transaction GetMostRecentTransaction(int singleId)
{
using (var db = new DataClasses1DataContext())
{
var transaction = (from t in db.Transactions
orderby t.WhenCreated descending
where t.Id == singleId
select t).SingleOrDefault();
return transaction;
}
}
Pero siempre siento que debería cerrar algo antes de salir de los corchetes de uso, por ejemplo, al definir la transacción antes de la declaración de uso, obtener su valor dentro de los corchetes y luego regresar después de los corchetes.
¿Definir y devolver la variable fuera de los corchetes de uso sería una mejor práctica o conservaría los recursos de alguna manera?
Respuestas:
No, creo que es más claro de esta manera. No se preocupe,
Dispose
seguirá llamándose "al salir", y solo después de que el valor de retorno se haya evaluado por completo. Si se produce una excepción en algún momento (incluida la evaluación del valor de retorno),Dispose
se seguirá llamando también.Si bien ciertamente podría tomar la ruta más larga, son dos líneas adicionales que solo agregan cruft y contexto adicional para realizar un seguimiento (mentalmente). De hecho, realmente no necesita la variable local adicional, aunque puede ser útil en términos de depuración. Usted podría simplemente tener:
De hecho, incluso podría sentir la tentación de usar la notación de puntos y poner la
Where
condición dentro deSingleOrDefault
:fuente
Echa un vistazo a esto
Comprender la instrucción 'using' en C #
fuente
No hay efectos secundarios de regresar desde dentro de una
using()
declaración.Si hace el código más legible es otra discusión.
fuente
Creo que es todo lo mismo. No hay nada malo en el código. El marco .NET no le importaría dónde se crea el objeto. Lo que importa es si se hace referencia o no.
fuente
Sí, puede haber un efecto secundario. Por ejemplo, si usa la misma técnica en el método de Acción ASP.NET MVC, obtendrá el siguiente error: "La instancia de ObjectContext se ha eliminado y ya no se puede usar para operaciones que requieren una conexión"
fuente