Menu
Coddy logo textTech

Using vs. Try-Finally

Parte da seção Lógica & Fluxo do Journey de C# da Coddy — lição 28 de 66.

Tanto as instruções using quanto os blocos try-finally ajudam a gerenciar recursos que precisam ser adequadamente descartados. A instrução using fornece uma maneira mais limpa e concisa de garantir que os objetos IDisposable sejam adequadamente descartados.

Vamos examinar primeiro uma abordagem try-finally. Aqui, StreamReader é uma classe que lê texto de um arquivo — ela mantém um handle de arquivo aberto, que é um recurso que deve ser liberado quando terminarmos:

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

O bloco finally garante que Dispose() seja chamado para liberar o handle de arquivo, mesmo se uma exceção ocorrer dentro do bloco try.

A declaração using simplifica esse padrão. Ela declara e inicializa o recurso entre parênteses e chama automaticamente Dispose() quando o bloco é encerrado — seja normalmente ou devido a uma exceção:

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

Isso é equivalente ao exemplo try-finally acima, mas com menos código boilerplate.

A instrução using chama automaticamente Dispose() quando o bloco termina, mesmo se uma exceção ocorrer. Ela substitui o padrão de limpeza try-finallynão try-catch. Se você também precisar tratar exceções, ainda pode envolver um bloco using dentro de um try-catch.

challenge icon

Desafio

Fácil

Crie um método chamado processFile que:

  1. Recebe um nome de arquivo como parâmetro string
  2. Usa a declaração using com um StreamReader para ler todas as linhas do arquivo
  3. Retorna o número de linhas no arquivo
  4. Se uma FileNotFoundException ocorrer, imprima "File not found" e retorne -1

Folha de consulta

A declaração using fornece limpeza automática de recursos para objetos IDisposable, garantindo que Dispose() seja chamada mesmo se exceções ocorrerem. Ela substitui o padrão verboso try-finally.

Abordagem try-finally:

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

Declaração using (abordagem mais limpa):

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

Ambas as abordagens garantem que Dispose() seja chamada quando o bloco termina. A declaração using lida com isso automaticamente, removendo a necessidade de uma verificação manual de null e bloco finally.

Pontos principais:
using substitui try-finally — não try-catch
try-catch ainda pode ser combinado com using para lidar com exceções
StreamReader lê arquivos de texto e implementa IDisposable, tornando-o ideal para uso com using

Experimente você mesmo

using System;
using System.IO;

class ProcessFile
{
    public static int processFile(string filename)
    {
        // Escreva seu código aqui
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Lógica & Fluxo