Что такое IDisposable и зачем он используется
Что проверяют
Понимаете ли вы, что сборщик мусора не управляет неуправляемыми ресурсами, и знаете ли шаблон освобождения.
Как отвечать
IDisposable это интерфейс с единственным методом Dispose, которым объект освобождает ресурсы, о которых сборщик мусора ничего не знает: дескрипторы файлов, соединения с базой, сокеты, потоки, объекты операционной системы.
Сборщик управляет только памятью и делает это когда захочет. Держать соединение с базой до следующей сборки недопустимо, поэтому освобождение делают явным и детерминированным.
Вызывают обычно через using, который гарантирует Dispose даже при исключении:
using var conn = new SqlConnection(cs); // Dispose в конце области видимостиШаблон для своего класса: публичный Dispose() вызывает защищённый Dispose(bool disposing) и GC.SuppressFinalize(this). Внутри при disposing освобождаются управляемые ресурсы, неуправляемые освобождаются всегда. Финализатор добавляют только если класс напрямую владеет неуправляемым ресурсом: он страховка на случай, если Dispose забыли, и он же откладывает сборку объекта на лишний цикл.
Для асинхронного освобождения есть IAsyncDisposable и await using, это важно для сетевых клиентов и потоков.
Где спотыкаются
Считают Dispose заменой сборщика мусора: он про ресурсы, а не про память.
Пишут финализатор всем классам подряд и ухудшают сборку.
Забывают using у HttpResponseMessage, соединений и файловых потоков.
Не знают, что HttpClient наоборот не стоит создавать и освобождать на каждый запрос: там исчерпываются сокеты.