Introdução
A entrevista para a posição de desenvolvedor C# não é apenas uma verificação de sintaxe. Os empregadores querem ver compreensão da plataforma .NET, princípios de funcionamento do CLR, capacidade de escrever código performático e conhecimento de abordagens modernas (async, LINQ, DI).
Neste artigo, analisaremos as principais perguntas sobre C# de A a Z — desde tipos de dados básicos até tópicos complexos como coleta de lixo e programação assíncrona. Cada pergunta é acompanhada por uma breve resposta e um exemplo de código, para que você se sinta confiante na entrevista.
1. Perguntas básicas: tipos, classes e memória
1.1. Qual a diferença entre Value Type e Reference Type?
Value Type (int, struct, enum) são armazenados na pilha e copiados por valor. Reference Type (class, string, array) são armazenados no heap, a variável contém uma referência ao objeto.
int a = 10;int b = a; // b é uma cópia, a e b são independentes
class MyClass { public int X; }MyClass obj1 = new MyClass { X = 5 };MyClass obj2 = obj1; // obj2 referencia o mesmo objetoobj2.X = 10; // obj1.X também se tornará 101.2. O que é Boxing e Unboxing?
Boxing é o empacotamento de um tipo de valor em um objeto (no heap). Unboxing é o processo inverso. O uso frequente reduz a performance.
int number = 42;object boxed = number; // Boxingint unboxed = (int)boxed; // Unboxing1.3. Fale sobre o Garbage Collector (Coletor de Lixo).
O GC no .NET libera automaticamente a memória de objetos que não têm mais referências. Funciona por gerações (Gen 0, 1, 2). Objetos de grande tamanho (>85 KB) vão para o Large Object Heap (LOH).
Dica: Não chame GC.Collect() manualmente — isso interfere nas otimizações do GC.
2. POO e princípios de design
2.1. Explique os princípios SOLID.
- S — Single Responsibility: uma classe deve ter apenas um motivo para mudar.
- O — Open/Closed: aberta para extensão, fechada para modificação.
- L — Liskov Substitution: subclasses devem substituir corretamente a classe base.
- I — Interface Segregation: muitas interfaces pequenas são melhores que uma grande.
- D — Dependency Inversion: dependências devem ser de abstrações, não de classes concretas.
2.2. O que é Dependency Injection (DI)?
DI é um padrão onde as dependências são passadas para a classe externamente (via construtor, método ou propriedade). No .NET Core há um contêiner DI embutido.
public interface ILogger{ void Log(string message);}
public class ConsoleLogger : ILogger{ public void Log(string message) => Console.WriteLine(message);}
public class OrderService{ private readonly ILogger _logger; public OrderService(ILogger logger) // DI via construtor { _logger = logger; }}3. LINQ, exceções e strings
3.1. Como funciona o LINQ? O que é execução adiada?
LINQ (Language Integrated Query) permite escrever consultas para coleções, bancos de dados (EF Core) e XML. Execução adiada significa que a consulta só é executada quando o resultado é iterado (por exemplo, via foreach ou .ToList()).
var numbers = new List<int> { 1, 2, 3, 4, 5 };var query = numbers.Where(n => n > 2); // consulta não executadanumbers.Add(6); // adiciona após criar a consultaforeach (var n in query) // execução aqui Console.WriteLine(n); // 3, 4, 5, 63.2. Qual a diferença entre String e StringBuilder?
String é um tipo imutável. Cada operação de concatenação cria um novo objeto. StringBuilder usa um buffer mutável e é eficiente para múltiplas alterações em strings.
// Ruim (muitas alocações)string s = "";for (int i = 0; i &