Como passar em uma entrevista de C#: principais perguntas e respostas
A entrevista para a posição de desenvolvedor C# / .NET não é apenas um teste de conhecimento técnico, mas também a capacidade de pensar e explicar conceitos complexos em palavras simples. Neste artigo, analisamos as perguntas mais frequentes feitas em entrevistas, com exemplos de código e explicações. O material será útil tanto para desenvolvedores junior quanto para middle.
1. Qual é a diferença entre value types e reference types?
Esta é uma pergunta básica, mas importante. Em C#, todos os tipos são divididos em duas categorias:
- Value types (tipos de valor) — são armazenados na stack, copiados quando atribuídos. Exemplos:
int,double,struct,enum. - Reference types (tipos de referência) — são armazenados no heap, a variável armazena uma referência ao objeto. Exemplos:
class,string,array,delegate.
Exemplo para a entrevista:
int a = 10;int b = a;b = 20;Console.WriteLine(a); // 10 — o valor não mudou
var obj1 = new MyClass { Value = 10 };var obj2 = obj1;obj2.Value = 20;Console.WriteLine(obj1.Value); // 20 — a referência é a mesmaNa entrevista, também costumam perguntar sobre boxing/unboxing — a conversão de um value type para object e vice-versa. Tente evitar isso no código, pois reduz o desempenho.
2. O que são delegates, events e lambda expressions?
Delegates são tipos que armazenam referências a métodos. Events são um wrapper sobre delegates, usado para implementar o padrão "publicador-assinante".
Exemplo de delegate:
public delegate void MyDelegate(string message);
public static void ShowMessage(string msg) => Console.WriteLine(msg);
MyDelegate del = ShowMessage;del("Hello from delegate");Exemplo de event:
public class Button{ public event EventHandler Click; public void Press() => Click?.Invoke(this, EventArgs.Empty);}Lambda expressions são uma forma concisa de escrever métodos anônimos. Elas são amplamente usadas em LINQ:
var numbers = new List<int> { 1, 2, 3, 4, 5 };var even = numbers.Where(x => x % 2 == 0).ToList();Na entrevista, podem perguntar: "Por que é melhor usar events em vez de delegates?" — resposta: events protegem a lista de assinantes de alterações externas (não é possível chamar Invoke de fora).
3. Como funciona async/await e qual a diferença para multithreading?
Esta é uma das perguntas mais populares. async/await é um syntactic sugar para trabalhar com operações assíncronas. Ele não cria uma nova thread, mas usa eficientemente a thread existente (thread da UI ou thread do pool).
Pontos-chave:
async— modificador do método que permite o uso deawait.await— pausa a execução do método até que a tarefa seja concluída, sem bloquear a thread.- O tipo de retorno é geralmente
TaskouTask<T>.
Exemplo:
public async Task<string> GetDataAsync(){ using var client = new HttpClient(); string result = await client.GetStringAsync("https://api.example.com"); return result;}Diferença para multithreading: multithreading (Thread, Task.Run) é a execução paralela de código em vários núcleos da CPU. Async/await é assincronia, que libera a thread para outras tarefas durante a espera (por exemplo, resposta de um servidor).
Dica: na entrevista, dê um exemplo real — carregar dados da rede ou de um arquivo. Evite async void (exceto para event handlers) — isso pode levar a exceções não tratadas e