Uso de Using frente a Try-Finally
Parte de la sección Lógica y Flujo del Journey de C# de Coddy. Lección 28 de 66.
Tanto las instrucciones using como los bloques try-finally ayudan a gestionar recursos que deben liberarse correctamente. La instrucción using proporciona una forma más limpia y concisa de garantizar que los objetos IDisposable se limpien correctamente.
Nota: using reemplaza el patrón try-finally para la liberación de recursos. No reemplaza try-catch. Aún puedes envolver un bloque using dentro de un try-catch para gestionar las excepciones.
Veamos primero un enfoque try-finally:
StreamReader reader = null;
try
{
reader = new StreamReader("file.txt");
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
finally
{
if (reader != null)
{
reader.Dispose();
}
}
La instrucción using simplifica este código:
using (StreamReader reader = new StreamReader("file.txt"))
{
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
La instrucción using llama automáticamente a Dispose() cuando se sale del bloque, incluso si se produce una excepción.
¿Qué es StreamReader?StreamReader es una clase que se utiliza para leer texto de archivos. Creas una pasando un nombre de archivo y abre el archivo para su lectura. Implementa IDisposable, por lo que debe cerrarse correctamente después de usarla, que es exactamente lo que using gestiona por ti.
Métodos comunes de StreamReader:
ReadToEnd(): lee todo el archivo como una única cadenaReadLine(): lee una línea a la vez y devuelvenullcuando se alcanza el final del archivo
Para contar las líneas de un archivo, puedes usar un bucle de ReadLine():
using (StreamReader reader = new StreamReader("file.txt"))
{
int lineCount = 0;
while (reader.ReadLine() != null)
{
lineCount++;
}
Console.WriteLine(lineCount);
}
También puedes combinar using con try-catch para gestionar excepciones como la ausencia de un archivo:
try
{
using (StreamReader reader = new StreamReader("file.txt"))
{
int lineCount = 0;
while (reader.ReadLine() != null)
{
lineCount++;
}
Console.WriteLine(lineCount);
}
}
catch (FileNotFoundException)
{
Console.WriteLine("File not found");
}
Desafío
FácilCrea un método llamado processFile que:
- Acepte un nombre de archivo como parámetro de tipo cadena
- Use la instrucción
usingcon unStreamReaderpara leer todas las líneas del archivo - Devuelva el número de líneas del archivo
- Si se produce una
FileNotFoundException, imprima "File not found" y devuelva -1
Pruébalo tú mismo
using System;
using System.IO;
class ProcessFile
{
public static int processFile(string filename)
{
// Escribe tu código aquí
}
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y Flujo
1Arrays multidimensionales
Conceptos básicos de arrays 2DDeclaración e inicialización de arrays 2DAcceso a elementos de arrays 2DBucles anidados con arrays 2DArrays irregularesOperaciones comunes con matricesRepaso: arrays multidimensionales4Técnicas de control de flujo
Retornos anticipadosCláusulas de guardaSentencias de salto (goto)Break y ContinueAplanar condicionales anidados7Operadores lógicos avanzados
Evaluación de cortocircuitoOperadores lógicos condicionalesPrecedencia de operadoresRepaso: operadores avanzados2Toma de decisiones avanzada
Múltiples condicionesLógica booleana complejaComparación entre If y SwitchSentencias Switch anidadasRepaso: decisiones avanzadas5Manejo de excepciones
Fundamentos de Try-CatchTipos de excepcionesMúltiples bloques CatchTrabajo con archivosBloque FinallyUso de Using frente a Try-FinallyExcepciones personalizadasRepaso: manejo de errores3Mejoras de bucles
Rendimiento de buclesIteración de estructuras complejasCada tipo de bucleRefactorización de buclesRepaso: bucles optimizados6Manejo de valores nulos
Conceptos básicos de referencias nulasTipos de valor anulablesPatrones de comprobación de valores nulosProgramación defensivaRepaso: seguridad frente a valores nulosPractica por tu cuenta: Compilador de C# online