Oii, Guilherme!
Que excelente observação. É muito comum sentirmos que estamos "dando voltas" ao aprender a manipular o buffer manualmente quando existem classes que resolvem tudo em poucas linhas, como o StreamReader ou o File.ReadAllLines.
Sua dúvida toca em um ponto fundamental da computação: a diferença entre abstração (facilidade) e controle (performance/recursos).
Sim, o uso de buffers é o padrão em produção, mas raramente você precisará gerenciá-los manualmente como estamos fazendo agora no curso. O StreamReader que você usou, por exemplo, utiliza um buffer internamente por padrão.
- Quando usar o File (ReadAllLines / ReadAllText):
Esta é a forma mais simples, porém carrega todo o conteúdo pra a memória RAM de uma vez.
- Use quando: O arquivo é pequeno (alguns KB ou poucos MB) e você tem memória sobrando.
- Evite quando: O arquivo tem centenas de megabytes ou gigabytes. Se você tentar abrir um arquivo de 10GB assim em um servidor com 8GB de RAM, a aplicação vai travar com um erro de
OutOfMemoryException.
- Quando usar o StreamReader (Sua sugestão)
É o meio-termo ideal. Ele lê o arquivo linha por linha, o que poupa memória, e já gerencia o buffer para você.
- Use quando: Você precisa processar arquivos de texto de forma sequencial e não quer se preocupar com bytes ou codificação manual. É o mais comum no dia a dia do desenvolvimento C#.
- Quando usar o FileStream com Buffer manual
Este é o nível mais baixo de acesso ao disco.
- Use quando:
- Arquivos binários: Se você estiver lendo uma imagem, um vídeo ou um arquivo compactado, não existem "linhas", apenas bytes. O
StreamReader não serve aqui. - Performance extrema: Em sistemas que precisam processar milhões de registros por segundo, o controle manual do buffer permite evitar que o C# crie muitos objetos temporários (strings), o que sobrecarrega o coletor de lixo (Garbage Collector).
- Comunicação de rede: Ao receber dados via TCP/IP, as informações chegam em "pacotes". Você precisa de um buffer para ir montando a mensagem conforme os dados chegam.
Por que o curso ensina assim?
O objetivo é que você entenda como o computador funciona por baixo do capô. Quando você usa o reader.ReadLine(), o C# está fazendo exatamente o que estamos aprendendo: preenchendo um buffer de bytes, procurando pelo caractere de "quebra de linha" e convertendo esses bytes em texto para você.
Entender o buffer te dá fundamentos pra trabalhar com qualquer tecnologia, desde drivers de hardware até sistemas de streaming de vídeo.
Espero que isso tenha esclarecido.
Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!