Principais erros de desenvolvedores C# iniciantes: de A a Z
\n\nA migração para C# e a plataforma .NET é uma jornada empolgante. No entanto, como em qualquer linguagem, os iniciantes frequentemente cometem os mesmos erros. Alguns desses erros levam a bugs difíceis de encontrar, outros à queda de desempenho. Neste artigo, analisaremos os erros mais comuns de desenvolvedores C# iniciantes, desde o uso incorreto de tipos até problemas com assincronicidade. Conhecer essas armadilhas ajudará você a escrever um código mais limpo, seguro e eficiente.
\n\n1. Ignorar NullReferenceException e falta de verificações
\n\nEste é, talvez, o erro mais comum que todo iniciante enfrenta. Você chama um método ou propriedade de um objeto que na verdade é null, e o aplicativo trava com NullReferenceException.
Problema: O desenvolvedor assume que o método sempre retorna um objeto, ou não verifica o resultado da chamada.
\n\nExemplo de código incorreto:
\npublic string GetCustomerName(int id)\n{\n var customer = _repository.FindById(id);\n // Se customer == null, a próxima linha irá falhar\n return customer.FullName.ToUpper();\n}\n\nComo corrigir: Use o operador condicional ou o operador ? (null-conditional).
public string GetCustomerName(int id)\n{\n var customer = _repository.FindById(id);\n // Chamada segura: se customer for null, retornará null\n return customer?.FullName?.ToUpper() ?? "Cliente desconhecido";\n}\n\nDica: No C# 8.0 e superior, use Nullable Reference Types. Isso permitirá que o compilador o avise sobre possíveis valores nulos em tempo de compilação.
\n\n2. Confusão entre value-types e reference-types (ref/out)
\n\nMuitos iniciantes não entendem a diferença entre passagem por valor e por referência. Isso se aplica especialmente aos modificadores ref e out.
Problema: Você pensa que passar um objeto para um método altera a variável original, mas isso nem sempre é verdade. Se você atribuir um novo objeto ao parâmetro, a variável original não será alterada (a menos que use ref).
Exemplo:
\npublic void ChangeName(string name)\n{\n name = "Novo nome"; // Isso NÃO alterará a variável original!\n}\n\nstring myName = "Nome antigo";\nChangeName(myName);\nConsole.WriteLine(myName); // Exibirá: "Nome antigo"\n\nComo corrigir: Use ref ou out se realmente precisar alterar a referência.
public void ChangeName(ref string name)\n{\n name = "Novo nome";\n}\n\nstring myName = "Nome antigo";\nChangeName(ref myName);\nConsole.WriteLine(myName); // Exibirá: "Novo nome"\n\nImportante: out é usado quando o método deve obrigatoriamente atribuir um valor ao parâmetro (antes de sair do método). ref é usado quando a variável já foi inicializada antes da chamada.
3. Uso incorreto de LINQ (enumerações múltiplas)
\n\nLINQ é uma ferramenta poderosa, mas pode impactar fortemente o desempenho se você não entender como funcionam as avaliações adiadas (deferred execution).
\n\nProblema: Chamar .Where() ou .Select() não executa a consulta imediatamente. Cada vez que você itera sobre o resultado (por exemplo, em um loop foreach), a consulta é executada novamente.
Exemplo de código incorreto:
\nvar numbers = Enumerable.Range(1, 1000);\nvar filtered = numbers.Where(n => n % 2 == 0);\n\n// Primeira passagem — a consulta é executada\nint count = filtered.Count();\n\n// Segunda passagem — a consulta é executada NOVAMENTE (mais uma vez)\nforeach (var num in filtered)\n{\n Console.WriteLine(num);\n}\n\nComo corrigir: Materia