Using vs. Try-Finally
Parte de la sección Lógica y Flujo del Journey de C# de Coddy — lección 28 de 66.
Tanto las sentencias using como los bloques try-finally ayudan a gestionar recursos que necesitan ser liberados adecuadamente. La sentencia using proporciona una forma más limpia y concisa de asegurar que los objetos IDisposable sean limpiados adecuadamente.
Nota: using reemplaza el patrón try-finally para la liberación de recursos — no reemplaza a try-catch. Aún puedes envolver un bloque using dentro de un try-catch para manejar 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 sentencia 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 el bloque finaliza, incluso si ocurre una excepción.
¿Qué es StreamReader?StreamReader es una clase utilizada para leer texto de archivos. Se crea una pasando un nombre de archivo, y esta abre el archivo para su lectura. Implementa IDisposable, por lo que debe cerrarse correctamente después de su uso — que es exactamente lo que using maneja por ti.
Métodos comunes de StreamReader:
ReadToEnd()— lee el archivo completo como una sola cadenaReadLine()— lee una línea a la vez, devuelvenullcuando se alcanza el final del archivo
Para contar las líneas de un archivo, puedes usar un bucle 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 manejar excepciones como un archivo faltante:
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:
- Reciba un nombre de archivo como un parámetro de tipo string
- Utilice la sentencia
usingcon unStreamReaderpara leer todas las líneas del archivo - Devuelva el número de líneas del archivo
- Si ocurre 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
1Multi-dimensional Arrays
2D Arrays BasicsDeclaring and Initializing 2DAccessing 2D Array ElementsNested Loops with 2D ArraysJagged ArraysCommon Matrix OperationsRecap - Multi-dimensional4Flow Control Techniques
Early ReturnsGuard ClausesJump Statements (goto)Break and ContinueFlatten Nested Conditionals7Logical Operators Advanced
Short-Circuit EvaluationConditional Logical OperatorsOperator PrecedenceRecap - Advanced Operators2Advanced Decision Making
Multiple ConditionsComplex Boolean LogicIf vs. Switch ComparisonNested Switch StatementsRecap - Advanced Decisions5Exception Handling
Try-Catch BasicsException TypesMultiple Catch BlocksWorking with FilesFinally BlockUsing vs. Try-FinallyCustom ExceptionsRecap - Error Handling3Loop Enhancements
Loop PerformanceIterating ComplexEach Loop TypeRefactoring LoopsRecap - Optimized Loops6Null Handling
Null Reference BasicsNullable Value TypesNull Checking PatternsDefensive ProgrammingRecap - Null Safety