Introdução: Por que C# parece difícil, embora não seja
\n\nVocê decidiu estudar C# — excelente escolha. É uma linguagem poderosa e moderna, usada em jogos na Unity, sistemas corporativos, aplicações web e até mesmo em parte do sistema operacional Windows. Mas, como qualquer linguagem, C# tem suas "armadilhas" nas quais quase todos os iniciantes caem.
\n\nO problema não é que C# seja difícil. O problema é que muitos aprendem de forma errada: decoram a sintaxe sem entender a lógica, copiam código da internet sem refletir e ignoram conceitos fundamentais. Neste artigo, vamos analisar os erros ao aprender C# mais comuns que iniciantes cometem e mostrar como corrigi-los. Você aprenderá não apenas "como não fazer", mas também receberá exemplos práticos de código.
\n\nTop 7 erros típicos de iniciantes em C# (com exemplos)
\n\n1. Confusão entre tipos de valor e tipos de referência
\n\nEste é, talvez, o erro de iniciantes em C# mais comum. Em C#, todos os tipos se dividem em dois grandes grupos: value types (int, bool, struct) e reference types (class, string, array). Iniciantes frequentemente pensam que, se passaram um objeto para um método, as alterações não refletirão externamente — ou vice-versa.
\n\nExemplo de erro:
\npublic class Player\n{\n public int Health { get; set; }\n}\n\npublic void TakeDamage(Player player)\n{\n player.Health -= 10; // Alteramos o objeto\n}\n\n// Uso:\nvar hero = new Player { Health = 100 };\nTakeDamage(hero);\nConsole.WriteLine(hero.Health); // Exibirá 90 — correto, mas o iniciante se surpreende\n\nAgora um exemplo com struct (tipo de valor):
\npublic struct Point\n{\n public int X;\n public int Y;\n}\n\npublic void MovePoint(Point p)\n{\n p.X = 10; // Isso não alterará o original!\n}\n\n// Uso:\nvar point = new Point { X = 0, Y = 0 };\nMovePoint(point);\nConsole.WriteLine(point.X); // Exibirá 0 — cópia!\n\nComo evitar: Lembre-se da regra: class — é passada por referência (alteramos o original), struct — por valor (trabalhamos com uma cópia). Para struct, sempre retorne um novo valor ou use ref.
2. Ignorar o tratamento de exceções (ou, pior, usar catch vazio)
\n\nIniciantes frequentemente escrevem código que falha na primeira entrada inesperada. Ou, pior ainda, usam um catch { } vazio que "engole" o erro. Este é um dos erros comuns em C# que leva a bugs difíceis de rastrear.
Exemplo ruim:
\ntry\n{\n int number = int.Parse(Console.ReadLine());\n Console.WriteLine(100 / number);\n}\ncatch { } // Erro engolido, o programa continua silenciosamente funcionando incorretamente\n\nExemplo bom:
\ntry\n{\n int number = int.Parse(Console.ReadLine());\n Console.WriteLine(100 / number);\n}\ncatch (FormatException ex)\n{\n Console.WriteLine($"Erro de formato: {ex.Message}");\n}\ncatch (DivideByZeroException)\n{\n Console.WriteLine("Não é possível dividir por zero!");\n}\nfinally\n{\n Console.WriteLine("O bloco finally é sempre executado");\n}\n\nDica: Sempre trate apenas as exceções que você entende. Para as demais, registre e relance adiante. Não use catch vazio sem parâmetros.
3. Uso incorreto de strings (String vs StringBuilder)
\n\nStrings em C# são imutáveis. Cada vez que você escreve str += "something", uma nova string é criada, e a antiga permanece na memória para o coletor de lixo. Em um loop de 1000 iterações, isso causa uma queda drástica de desempenho.
Erro de iniciante:
\nstring result = "";\nfor (int i = 0; i < 1000; i++)\n{\n result += i.ToString(); // Cada iteração — uma nova string!\n}\nConsole.WriteLine(result);