C# 8.0 – Specification – Using Declarations
Índice general – C# 8.0 – Specification
Una de las características del lenguaje C# es la posibilidad de utilizar la palabra reservada using.
El principal propósito de using es el de asegurar un correcto uso de «disposar» los objetos utilizados.
En operaciones de entrada/salida es muy común encontrarnos con la problemática por la cual dejamos un fichero abierto después de realizar las operaciones necesarias con él, o con conexiones a bases de datos abiertas que podrían desencadenar en problemas que generalmente ocurrirán en tiempo de ejecución.
La regla base es que nuestras clases implementen la interfaz IDisposable, y que una vez finalicemos el uso de una clase que implementa la interfaz, «limpiemos» las posibles referencias para evitar conflictos y problemas en tiempo de ejecución.
Una de las soluciones más cómodas para llamar a Dispose es utilizar using.
Una vez finalice el proceso que está dentro de using, Dispose será llamado de forma automática resolviendo los posibles problemas o conflictos que de otra manera nos podríamos encontrar.
Imaginemos el siguiente código:
private static void ReadFile() { var reader = new StreamReader(new FileStream(@"C:\TEMP\sample.txt", FileMode.OpenOrCreate)); Console.WriteLine(reader.ReadToEnd()); }
Si llamamos a esta función dos veces, la primera llamada funcionará como queremos y leerá el contenido de C:\TEMP\sample.txt y lo mostrará en la consola.
Pero en la segunda llamada, recibiremos un error:
System.IO.IOException: ‘The process cannot access the file ‘C:\TEMP\sample.txt’ because it is being used by another process.’
Utilizando using como hemos venido haciendo durante años, solventaremos el problema:
private static void ReadFile() { using (var reader = new StreamReader(new FileStream(@"C:\TEMP\sample.txt", FileMode.OpenOrCreate))) { Console.WriteLine(reader.ReadToEnd()); } }
Ahora bien, C# 8.0 introduce ahora una forma más sencilla de llevar a cabo la misma operación que resulta un híbrido entre estas dos formas, con la ventaja de utilizar Dispose por debajo.
Se trata de hacer el código más legible y corto, aunque para el gusto (como siempre), los colores.
El código equivalente anterior en C# 8.0 quedará de la siguiente forma:
private static void ReadFile() { using var reader = new StreamReader(new FileStream(@"C:\TEMP\sample.txt", FileMode.OpenOrCreate)); Console.WriteLine(reader.ReadToEnd()); }
En sí es una forma más cómoda y elegante de realizar la misma acción, y como vemos al menos en este ejemplo, es casi igual que la que hacíamos sin using pero poniendo únicamente la palabra reservada using delante.
Happy Coding!
2 Responsesso far
Excelente artículo y definitivamente es mucho más organizado sobre todo cuando tenemos que hacer un uso de varios Using dentro del cuerpo del método. Algo para agregar es que al finalizar el método, todos los using declarados de esta forma al finalizar el método llamarían el dispose en un orden inverso a la declaración.
using var myVariable = ….
using var myVariable2 = ….
using var myVariable3 = ….
y al finalizar el método el orden de finalización sería
myVariable3.Dispose();
myVariable2.Dispose();
myVariable.Dispose();
Saludos 💪
Correcto Javier.
Lo tenía en mente comentarlo pero se me ha pasado totalmente.
Gracias por indicarlo! 🙂