linguagem
C# / .NET
C#/.NET em entrevista cobra o modelo de execução assíncrona (Task, `async/await`, deadlock por `.Result`, `ConfigureAwait`), a diferença entre struct e class (stack x heap, semântica de cópia), avaliação preguiçosa do LINQ, e o padrão `IDisposable`/`using` para recursos não gerenciados.
Simulador de C# / .NET
Tópicos por senioridade
- Em breve
Perguntas mais cobradas
ver todas →- Difícil
Deadlock por `.Result` / `.Wait()` em código async
`.Result`/`.Wait()` bloqueia a thread do SynchronizationContext que a continuação do `await` precisa → os dois se esperam. Correto: `await` de ponta a ponta; `ConfigureAwait(false)` em libs.
- Médio
Struct x class: valor x referência
class = referência (copia o ponteiro); struct = valor (copia os bytes). Struct grande = cópia cara; mutar struct numa coleção muta uma cópia. Faça structs pequenas e imutáveis.
- Médio
LINQ é preguiçoso: avaliação diferida
A query só roda quando você itera (foreach/ToList/Count). Iterar duas vezes reexecuta; mudanças na fonte antes da iteração contam; exceção estoura longe da definição.
- Médio
`IDisposable`, `using` e recursos não gerenciados
GC cuida de memória, não de recursos do SO (arquivo, conexão, lock). `using`/`Dispose()` libera de forma determinística ao sair do escopo (try/finally embutido). Esquecer num DB connection esgota o pool.
- Médio
Nullable reference types (`string?`) no C# moderno
`string` = não-nulo, `string?` = pode ser nulo, com warning do compilador ao desreferenciar sem checar. Opt-in por warning porque ligar num codebase antigo gera centenas de avisos (o modelo velho assumia tudo nulável).
- Médio
Retornar `IEnumerable<T>` x `List<T>` x `IReadOnlyList<T>`
`List<T>` público vaza implementação e deixa mutar. `IEnumerable<T>` é abstrato mas pode ser lazy (reexecuta). `IReadOnlyList<T>` (com `.ToList()` por baixo) comunica 'pronto e imutável' — geralmente o melhor.