← Назад к вопросам

Для чего нужен Dispose?

1.2 Junior🔥 241 комментариев
#Основы C# и .NET#Память и Garbage Collector

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Для чего нужен Dispose?

Dispose нужен для немедленного освобождения неуправляемых ресурсов. Сборщик мусора управляет только памятью, а файлы, соединения с БД и сокеты требуют явного закрытия.

Проблема

Когда ты открываешь файл, операционная система выделяет дескриптор. Сборщик мусора может удалить объект, но файл останется открытым. Это приводит к утечкам ресурсов.

Решение — IDisposable

public class FileManager : IDisposable
{
    private FileStream _file;
    
    public void Dispose()
    {
        _file?.Dispose();
    }
}

using (var mgr = new FileManager())
{
    // работаем
}  // Dispose гарантировано вызовется

Правильная реализация

public class Resource : IDisposable
{
    private bool _disposed;
    
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
    
    protected virtual void Dispose(bool disposing)
    {
        if (!_disposed)
        {
            if (disposing)
            {
                // управляемые ресурсы
            }
            // неуправляемые ресурсы
            _disposed = true;
        }
    }
    
    ~Resource() => Dispose(false);
}

Когда критично

  • Файлы
  • Соединения с БД
  • Сетевые сокеты
  • Таймеры

Всегда используй using statement для гарантированного вызова Dispose.