Usando 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 devidamente liberados. A instrução using oferece uma maneira mais limpa e concisa de garantir que os objetos IDisposable sejam devidamente limpos.
Observação: using substitui o padrão try-finally para descarte. Ele não substitui try-catch. Você ainda pode envolver um bloco using dentro de um try-catch para tratar exceções.
Vamos analisar primeiro uma 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();
}
}
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 Dispose() automaticamente 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, portanto deve ser fechada corretamente após o uso, que é exatamente o que using faz por você.
Métodos comuns de StreamReader:
ReadToEnd(): lê o arquivo inteiro como uma única stringReadLine(): lê uma linha por vez e retornanullquando o final do arquivo é alcançado
Para contar as linhas de 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 a ausência de um arquivo:
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:
- Aceite um nome de arquivo como parâmetro do tipo string
- Use a instrução
usingcom umStreamReaderpara ler todas as linhas do arquivo - Retorne o número de linhas do arquivo
- Se ocorrer uma
FileNotFoundException, imprima "File not found" e retorne -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
1Matrizes Multidimensionais
Noções Básicas de Matrizes 2DDeclaração e Inicialização de Matrizes 2DAcesso aos Elementos de Matrizes 2DLoops Aninhados com Matrizes 2DMatrizes IrregularesOperações Comuns com MatrizesRevisão - Multidimensional4Técnicas de Controle de Fluxo
Retornos AntecipadosCláusulas de GuardaInstruções de Salto (goto)Break e ContinueSimplificando Condicionais Aninhadas7Operadores Lógicos Avançados
Avaliação de Curto-CircuitoOperadores Lógicos CondicionaisPrecedência de OperadoresRevisão - Operadores Avançados2Tomada de Decisões Avançada
Múltiplas CondiçõesLógica Booleana ComplexaComparação entre If e SwitchInstruções Switch AninhadasRevisão - Decisões Avançadas5Tratamento de Exceções
Noções básicas de Try-CatchTipos de ExceçãoMúltiplos blocos CatchTrabalhando com ArquivosBloco FinallyUsando Using vs. Try-FinallyExceções PersonalizadasRecapitulação - Tratamento de Erros3Aprimoramentos de Loops
Desempenho de LoopsIteração de Estruturas ComplexasCada Tipo de LoopRefatoração de LoopsRevisão - Loops Otimizados6Tratamento de Nulos
Fundamentos de Referências NulasTipos de Valor AnuláveisPadrões de Verificação de NulosProgramação DefensivaRecapitulação — Segurança contra NulosPratique por conta própria: Compilador de C# online