`IDisposable`, `using` e recursos não gerenciados
Pergunta
Pra que serve `IDisposable`/`using` em C#, se o .NET já tem garbage collector?
Resposta esperada
O GC gerencia MEMÓRIA, mas não sabe quando liberar recursos NÃO gerenciados: handles de arquivo, conexões de rede/banco, locks, handles do SO, objetos gráficos. Esses precisam ser liberados de forma determinística, não 'quando o GC quiser'. `IDisposable.Dispose()` é o método pra isso, e `using (var x = ...) { }` (ou `using var x = ...;`) garante que `Dispose` é chamado ao sair do escopo, mesmo com exceção — é o try/finally embutido. Se você esquece o `using` numa conexão de banco, ela fica presa até o GC coletar o objeto e rodar o finalizer (não determinístico), e você esgota o pool de conexões antes disso. O padrão completo (Dispose + finalizer + `GC.SuppressFinalize`) é pra quem escreve a classe que segura o recurso; quem só usa precisa lembrar do `using`.
Por que perguntam isso
Pergunta pleno de C#. Paralelo com context manager do Python e `drop` do Rust. Sinal bom: 'GC é memória, não recurso do SO'.