Menu
Coddy logo textTech

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

Desafío

Fácil

Crea un método llamado processFile que:

  1. Acepte un nombre de archivo como parámetro de tipo cadena
  2. Use la instrucción using con un StreamReader para leer todas las líneas del archivo
  3. Devuelva el número de líneas del archivo
  4. 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í
    }
}
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

Practica por tu cuenta: Compilador de C# online