Menu
Coddy logo textTech

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 cadena
  • ReadLine() — lee una línea a la vez, devuelve null cuando 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");
}
challenge icon

Desafío

Fácil

Crea un método llamado processFile que:

  1. Reciba un nombre de archivo como un parámetro de tipo string
  2. Utilice la sentencia using con un StreamReader para leer todas las líneas del archivo
  3. Devuelva el número de líneas del archivo
  4. 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í
    }
}
quiz iconPonte a prueba

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