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 instrucciones using como los bloques try-finally ayudan a administrar recursos que necesitan ser eliminados correctamente. La instrucción using proporciona una forma más limpia y concisa de garantizar que los objetos IDisposable se limpien correctamente.

Veamos primero un enfoque try-finally. Aquí, StreamReader es una clase que lee texto de un archivo — mantiene un identificador de archivo abierto, que es un recurso que debe liberarse cuando terminamos:

StreamReader reader = null;
try
{
    reader = new StreamReader("file.txt");
    string content = reader.ReadToEnd();
    Console.WriteLine(content);
}
finally
{
    if (reader != null)
    {
        reader.Dispose();
    }
}

El bloque finally garantiza que se llame a Dispose() para liberar el identificador de archivo, incluso si ocurre una excepción dentro del bloque try.

La declaración using simplifica este patrón. Declara e inicializa el recurso entre paréntesis, y llama automáticamente a Dispose() cuando se sale del bloque — ya sea normalmente o debido a una excepción:

using (StreamReader reader = new StreamReader("file.txt"))
{
    string content = reader.ReadToEnd();
    Console.WriteLine(content);
}

Esto es equivalente al ejemplo try-finally anterior, pero con menos código repetitivo.

La instrucción using llama automáticamente a Dispose() cuando se sale del bloque, incluso si ocurre una excepción. Reemplaza el patrón de limpieza try-finallyno try-catch. Si también necesitas manejar excepciones, aún puedes envolver un bloque using dentro de un try-catch.

challenge icon

Desafío

Fácil

Crea un método llamado processFile que:

  1. Toma un nombre de archivo como parámetro de tipo string
  2. Usa la declaración using con un StreamReader para leer todas las líneas del archivo
  3. Devuelve el número de líneas en el archivo
  4. Si ocurre una FileNotFoundException, imprime "File not found" y devuelve -1

Hoja de referencia

La declaración using proporciona una limpieza automática de recursos para objetos IDisposable, asegurando que se llame a Dispose() incluso si ocurren excepciones. Reemplaza el patrón verboso try-finally.

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();
    }
}

Declaración using (enfoque más limpio):

using (StreamReader reader = new StreamReader("file.txt"))
{
    string content = reader.ReadToEnd();
    Console.WriteLine(content);
}

Ambos enfoques aseguran que se llame a Dispose() cuando sale del bloque. La declaración using maneja esto automáticamente, eliminando la necesidad de una verificación manual de null y un bloque finally.

Puntos clave:
using reemplaza try-finally — no try-catch
try-catch aún puede combinarse con using para manejar excepciones
StreamReader lee archivos de texto e implementa IDisposable, lo que lo hace ideal para usar con using

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