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-finally — não try-catch. Se você também precisar tratar exceções, ainda pode envolver um bloco using dentro de um try-catch.
Desafio
FácilCrie um método chamado processFile que:
- Recebe um nome de arquivo como parâmetro string
- Usa a declaração
usingcom umStreamReaderpara ler todas as linhas do arquivo - Retorna o número de linhas no arquivo
- Se uma
FileNotFoundExceptionocorrer, 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
}
}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
1Multi-dimensional Arrays
2D Arrays BasicsDeclaring and Initializing 2DAccessing 2D Array ElementsNested Loops with 2D ArraysJagged ArraysCommon Matrix OperationsRecap - Multi-dimensional4Flow Control Techniques
Early ReturnsGuard ClausesJump Statements (goto)Break and ContinueFlatten Nested Conditionals7Logical Operators Advanced
Short-Circuit EvaluationConditional Logical OperatorsOperator PrecedenceRecap - Advanced Operators2Advanced Decision Making
Multiple ConditionsComplex Boolean LogicIf vs. Switch ComparisonNested Switch StatementsRecap - Advanced Decisions5Exception Handling
Try-Catch BasicsException TypesMultiple Catch BlocksWorking with FilesFinally BlockUsing vs. Try-FinallyCustom ExceptionsRecap - Error Handling3Loop Enhancements
Loop PerformanceIterating ComplexEach Loop TypeRefactoring LoopsRecap - Optimized Loops6Null Handling
Null Reference BasicsNullable Value TypesNull Checking PatternsDefensive ProgrammingRecap - Null Safety