Por que a entrevista de C# não é um exame, mas um diálogo
\n\nImagine: você está sentado em frente a um tech lead ou desenvolvedor sênior. Ele olha para você não como um inimigo, mas como um futuro colega. Mas na sua cabeça é uma névoa, suas mãos suam, e na pergunta sobre IDisposable você de repente esquece o que é isso. Familiar?
A entrevista de C# não é um teste escolar onde você só precisa "adivinhar a letra". É uma verificação do seu raciocínio de engenharia, capacidade de argumentar e, claro, conhecimento básico da plataforma .NET. Neste artigo, vamos abordar os principais tópicos que realmente são perguntados nas entrevistas (spoiler: 80% das perguntas se repetem repetidamente).
\n\nBase que você precisa saber de cor
\n\nSe você está indo para uma entrevista daqui a uma hora e não tem tempo para se preparar — leia esta seção. É o "pão" do desenvolvedor C#. Sem esse conhecimento, você não será contratado nem para júnior.
\n\n1. Tipos de dados: Value vs Reference
\n\nEsta é, talvez, a pergunta mais popular. O entrevistador quer ouvir não apenas "int é tipo de valor, class é tipo de referência". É importante que você entenda como isso funciona internamente.
\n\n// Exemplo que é frequentemente dado em entrevistas\nstruct Point {\n public int X;\n public int Y;\n}\n\nclass PointClass {\n public int X;\n public int Y;\n}\n\nvoid Main() {\n Point p1 = new Point { X = 10, Y = 20 };\n Point p2 = p1;\n p2.X = 999;\n Console.WriteLine(p1.X); // 10 — cópia\n\n PointClass pc1 = new PointClass { X = 10, Y = 20 };\n PointClass pc2 = pc1;\n pc2.X = 999;\n Console.WriteLine(pc1.X); // 999 — referência\n}\n\nPonto-chave: struct é copiada inteiramente, class é passada por referência. E sim, string é um tipo de referência, mas se comporta como value devido à imutabilidade. Isso também é frequentemente perguntado.
2. Boxing e Unboxing
\n\nTópico simples, mas eles gostam dele. Imagine que você coloca um tipo de valor (int) em um object. Ocorre o boxing. Quando você o retira — unboxing. Isso é caro em termos de desempenho.
\n\nint number = 42;\nobject boxed = number; // boxing\nint unboxed = (int)boxed; // unboxing\n\nEm projetos modernos, isso é raro, mas conhecer o mecanismo mostra que você entende como o .NET gerencia a memória.
\n\n3. Interfaces e classes abstratas
\n\nPergunta clássica: "Quando usar interface e quando usar abstract class?"
\n\n- \n
- Interface — contrato. Se você tem classes diferentes que devem ser capazes de fazer a mesma coisa (por exemplo, voar: avião, pássaro, drone). \n
- Classe abstrata — implementação base. Se as classes têm lógica comum (por exemplo, todos os animais respiram, mas de maneiras diferentes). \n
public interface IFlyable {\n void Fly();\n}\n\npublic abstract class Animal {\n public abstract void MakeSound();\n public void Breathe() => Console.WriteLine("Inspirar-expirar");\n}\n\nNo C# 8.0+, as interfaces ganharam implementação padrão, mas na entrevista é melhor falar sobre a abordagem clássica.
\n\nPerguntas avançadas: onde está a pegadinha
\n\nQuando a base é dominada, o entrevistador começa a "cavar mais fundo". Aqui estão os tópicos que mais frequentemente causam travamento.
\n\n4. Async/Await e threads
\n\nMuitos confundem assincronia com multithreading. Lembre-se: async/await é sobre liberar a thread, não sobre criar uma nova.
public async Task<string> GetDataAsync() {\n using HttpClient client = new HttpClient();\n // A thread é liberada enquanto esperamos a resposta\n string result = await client.GetStringAsync("https://example.com");\n return result;\n}\n\nFrequentemente perguntam sobre ConfigureAwait(false). Resposta: é necessário para não retornar ao contexto de sincronização original (por exemplo, na thread de UI do WPF). Em bibliotecas — sempre use, em aplicações — com cuidado.