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 stringReadLine()— lê uma linha por vez, retornanullquando 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");
}
Desafio
FácilCrie um método chamado processFile que:
- Recebe um nome de arquivo como um parâmetro string
- Usa a instrução
usingcom umStreamReaderpara ler todas as linhas do arquivo - Retorna o número de linhas no arquivo
- Se uma
FileNotFoundExceptionocorrer, 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
}
}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