Como passar em uma entrevista de C#: principais perguntas e respostas
A entrevista para a posição de desenvolvedor C#/.NET é uma verificação tanto do conhecimento teórico da plataforma quanto das habilidades práticas de escrita de código. Os empregadores querem ver não apenas uma pessoa que sabe escrever código, mas um engenheiro que entende o funcionamento interno do .NET, gerenciamento de memória, assincronia e os princípios SOLID.
Neste artigo, reunimos as 10 principais perguntas que são mais frequentemente feitas em entrevistas de C#. Você aprenderá não apenas as respostas corretas, mas também as armadilhas que os entrevistadores observam. O material será útil tanto para desenvolvedores junior quanto para especialistas de nível médio.
1. Perguntas sobre fundamentos de POO em C#
Sem entender a programação orientada a objetos, é impossível passar em uma entrevista de C#. Os entrevistadores verificam não apenas as definições, mas também a capacidade de aplicar os princípios na prática.
Quais princípios de POO são implementados em C#?
C# suporta completamente os quatro pilares da POO:
- Encapsulamento — ocultação da implementação interna através de modificadores de acesso (
private,protected,internal). - Herança — uma classe pode herdar o comportamento de uma classe base (herança única).
- Polimorfismo — a capacidade de trabalhar com diferentes tipos através de uma interface única (métodos virtuais, classes abstratas).
- Abstração — destacar as características essenciais de um objeto e ignorar as não essenciais (interfaces, classes abstratas).
Exemplo de pergunta: "Qual a diferença entre uma classe abstrata e uma interface?"
Isso é clássico. A diferença chave é que a interface define apenas um contrato (assinaturas de métodos sem implementação), enquanto a classe abstrata pode conter tanto implementação quanto estado (campos). Em C#, a partir da versão 8.0, as interfaces podem ter implementação padrão, mas isso não anula a diferença conceitual.
// Classe abstratapublic abstract class Animal{ public string Name { get; set; } public abstract void MakeSound(); // sem implementação public void Sleep() => Console.WriteLine("Zzz..."); // com implementação}
// Interfacepublic interface IMovable{ void Move(); // apenas contrato}2. Gerenciamento de memória e Garbage Collector
Entender como o GC funciona é um sinal de um desenvolvedor experiente. Perguntas sobre este tópico frequentemente se tornam um filtro entre junior e middle.
Como o Garbage Collector funciona no .NET?
O GC opera no managed heap e libera memória de objetos que não têm mais referências. Ele usa um modelo geracional (Generation 0, 1, 2):
- Gen 0 — objetos de curta duração (limpo com mais frequência).
- Gen 1 — um buffer entre Gen 0 e Gen 2.
- Gen 2 — objetos de longa duração (limpo raramente).
Exemplo de pergunta: "O que é finalização e IDisposable?"
O finalizador (~ClassName()) é chamado pelo GC antes de liberar a memória, mas o momento de sua chamada é não determinístico. Para a limpeza determinística de recursos não gerenciados, usa-se o padrão IDisposable:
public class ResourceHolder : IDisposable{ private bool _disposed = false;
public void Dispose() { Dispose(true); GC.SuppressFinalize(this); }
protected virtual void Dispose(bool disposing) { if (_disposed) return; if (disposing) { /* libera recursos gerenciados */ } /* libera recursos não gerenciados */ _disposed = true; }
~ResourceHolder() => Dispose(false);}3. Programação assíncrona: async/await
Uma entrevista moderna de C# raramente passa sem perguntas sobre assincronia. Este é um tópico chave para