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 descartados adequadamente. A instrução using fornece uma maneira mais limpa e concisa de garantir que os objetos IDisposable sejam limpos adequadamente.

Nota: using substitui o padrão try-finally para descarte — ele não substitui o try-catch. Você ainda pode envolver um bloco using dentro de um try-catch para tratar exceções.

Vamos dar uma olhada em uma abordagem try-finally primeiro:

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

A instrução using simplifica este código:

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

A instrução using chama automaticamente Dispose() quando o bloco é encerrado, mesmo que ocorra uma exceção.

O que é StreamReader?
StreamReader é uma classe usada para ler texto de arquivos. Você cria uma passando um nome de arquivo, e ela abre o arquivo para leitura. Ela implementa IDisposable, então deve ser fechada adequadamente após o uso — que é exatamente o que o using gerencia para você.

Métodos comuns do StreamReader:

  • ReadToEnd() — lê o arquivo inteiro como uma única string
  • ReadLine() — lê uma linha por vez, retorna null quando o fim do arquivo é alcançado

Para contar linhas em um arquivo, você pode usar um loop ReadLine():

using (StreamReader reader = new StreamReader("file.txt"))
{
    int lineCount = 0;
    while (reader.ReadLine() != null)
    {
        lineCount++;
    }
    Console.WriteLine(lineCount);
}

Você também pode combinar using com try-catch para lidar com exceções como um arquivo ausente:

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

Desafio

Fácil

Crie um método chamado processFile que:

  1. Recebe um nome de arquivo como um parâmetro string
  2. Usa a instruçã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, imprime "File not found" e retorna -1

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