Introdução: Por que desenvolvedores C# iniciantes cometem os mesmos erros?
C# é uma linguagem poderosa e elegante, mas sua flexibilidade muitas vezes se torna uma armadilha para iniciantes. Muitos vêm de outras linguagens (Python, JavaScript) e tentam aplicar padrões familiares que funcionam de forma diferente no .NET. Neste artigo, vamos analisar os 5 erros mais comuns que desenvolvedores C# iniciantes cometem. Você aprenderá não apenas "como não fazer", mas também receberá exemplos concretos de código correto. Vamos lá!
1. Confusão entre ref, out e passagem por valor
Um dos erros mais frequentes é não entender como o C# passa parâmetros. Por padrão, todos os tipos de valor (int, bool, struct) são passados por valor. Tipos de referência (classes) são passados por referência, mas a própria referência é passada por valor.
Erro: Tentar modificar um tipo de valor através de um parâmetro sem ref
public void BadIncrement(int number){ number++; // Isso não alterará a variável original!}
int x = 5;BadIncrement(x);Console.WriteLine(x); // Exibirá 5, não 6Como fazer corretamente: Use ref para tipos de valor
public void GoodIncrement(ref int number){ number++; // Agora a alteração refletirá no original}
int y = 5;GoodIncrement(ref y);Console.WriteLine(y); // Exibirá 6Dica: Use out se o método precisar retornar vários valores. Mas lembre-se: out exige inicialização obrigatória dentro do método.
2. Ignorar a imutabilidade das strings (string)
Muitos iniciantes pensam que string é um simples array de caracteres. Na verdade, strings em C# são imutáveis (immutable). Cada operação de concatenação cria um novo objeto na memória.
Erro: Concatenação em loop
string result = "";for (int i = 0; i < 1000; i++){ result += i.ToString(); // Cada iteração cria uma nova string! (O(n²))}Como fazer corretamente: Use StringBuilder
var sb = new System.Text.StringBuilder();for (int i = 0; i < 1000; i++){ sb.Append(i); // Funciona rapidamente, O(n)}string result = sb.ToString();Importante: Para concatenação simples de 2-3 strings, use $"string {variable}" (interpolação). Para loops, sempre use StringBuilder.
3. Tratamento incorreto de null e NullReferenceException
Desenvolvedores iniciantes frequentemente esquecem de verificar objetos quanto a null, o que causa a queda da aplicação com NullReferenceException. Este é o erro mais popular em C#.
Erro: Chamar método sem verificação
string name = GetName(); // pode retornar nullint length = name.Length; // Se name == null - o programa vai cair!Como fazer corretamente: Use o operador condicional null (?.) e o operador de coalescência nula (??)
string name = GetName();int length = name?.Length ?? 0; // Se name for null, length será 0
// Ou verificação clássicaif (name != null){ Console.WriteLine(name.Length);}Dica para .NET 6+: Ative os nullable reference types no projeto. O compilador avisará você sobre potenciais perigos de null.
4. "Engolir" exceções (catch vazio)
Iniciantes frequentemente escrevem catch (Exception) { } — um bloco de captura vazio. Isso torna o código um "assassino silencioso": o programa continua funcionando, mas com dados incorretos.
Erro: catch vazio
try{ int.Parse(userInput);}catch (Exception){ // Ignorar o erro - má prática!}Como fazer corretamente: Capture exceções específicas ou faça log
try{ int result = int.Parse(userInput);}catch (FormatException ex){ Console.WriteLine($"Erro de formato