resource-cleanup usa la interfaz IDispose para indicar que el recurso de algún objeto u otro estado del programa debía liberarse o restablecerse cuando el objeto ya no era necesario (y que confiar en el recolector de basura no lograría esto ni proporcionaría el nivel de control requerido), y que el método IDisposable.Dispose() era el lugar natural para esas operaciones de limpieza.
Existe otra construcción, el bloque using, que permite, desde la perspectiva de quien llama, reunir toda la gestión del ciclo de vida de los recursos en una única instrucción.
using (var file = new File("my_secrets"))
{
file.WriteSecret("xxxxxxx");
}
En el ejemplo anterior, los recursos del sistema de archivos asociados a file se liberarán y devolverán al sistema operativo cuando se salga del bloque using.
Para que el patrón funcione, la variable de la instrucción using debe ser un tipo de referencia que implemente la interfaz IDisposable y debe liberar recursos o restablecer el estado del programa en su método Dispose().
C# 8 introduce un refinamiento del patrón. Una instrucción using puede colocarse al principio de un bloque.
using var drawingResource = some_provided_or_new_object;
try
{
drawingResource.DrawSomething();
}
catch (Exception)
{
throw;
}
Los desarrolladores de Java puede que reconozcan esto como un equivalente del mecanismo de gestión automática de recursos introducido en Java 7.
Vuelves a trabajar en el sistema ORM (Object Relationship Mapping) que se presentó en object-relational-mapping.
Nuestro análisis del uso del ORM muestra que el 95 % de las transacciones se ejecutan desde un único método que realiza la llamada, y se ha decidido que sería más apropiado contar con un único método del ORM que abriera, escribiera y confirmara una transacción.
La base de datos tiene los siguientes métodos de instancia:
Database.BeginTransaction() inicia una transacción en la base de datos.Database.Write(string data) escribe datos en la base de datos dentro de la transacción. Si recibe datos incorrectos, se lanzará una excepción. Un intento de llamar a este método sin haber llamado antes a BeginTransaction() provocará que se lance una excepción. Si tiene éxito, el estado interno de la base de datos cambiará a DataWritten.Database.EndTransaction() confirma la transacción en la base de datos. Puede lanzar una excepción si no puede cerrar la transacción o si no se había llamado a Database.BeginTransaction().Database.Dispose() limpiará la base de datos si se lanza una excepción durante una transacción. Esto cambiará el estado de la base de datos a Closed.Implementa el método Orm.Write() para iniciar una transacción de base de datos, escribir los datos recibidos y confirmar la transacción. Todas las excepciones, incluida InvalidOperationException, deben poder llegar a quien realiza la llamada sin registrarlas ni intervenir de ninguna otra forma.
Database db = new Database();
Orm orm = new Orm(db);
orm.Write("good write");
// => database has an internal state of State.Closed
orm.Write("bad write");
// => an exception is thrown but database is left with an internal state of State.Closed
orm.Write("bad commit");
// => an exception is thrown but database is left with an internal state of State.Closed
Han pasado unos meses desde que se introdujo Orm.Write() y hay división en el equipo. A muchos desarrolladores les gustaría que el ORM gestionara los errores cuando se lanzan excepciones y que simplemente devolviera al llamador una indicación de éxito.
Implementa el método Orm.WriteSafely() para iniciar una transacción de base de datos, escribir los datos recibidos y confirmar la transacción (igual que antes). Debe devolver true si la escritura se ha realizado correctamente; en caso contrario, false. No intentes registrar la excepción.
Database db = new Database();
Orm orm = new Orm(db);
orm.WriteSafely("good write");
// => true
orm.WriteSafely("bad write");
// => false
orm.WriteSafely("bad commit");
// => false
Regístrate en Exercism para aprender y dominar C# con 62 conceptos178 ejercicios y mentoría humana real, todo gratis.