Поделиться через


Очистка неуправляемых ресурсов

Для большинства создаваемых приложеним объектов можно использовать сборщик мусора .NET для обработки управления памятью. Однако при создании объектов, включающих неуправляемые ресурсы, необходимо явно освободить эти ресурсы после их завершения. Наиболее распространенными типами неуправляемых ресурсов являются объекты, которые упаковывают ресурсы операционной системы, такие как файлы, окна, сетевые подключения или подключения к базе данных. Хотя сборщик мусора может отслеживать время существования объекта, инкапсулирующего неуправляемый ресурс, он не знает, как освободить и очистить неуправляемый ресурс.

Если ваши типы используют неуправляемые ресурсы, рекомендуется сделать следующее.

  • Реализуйте шаблон удаления. Для этого необходимо предоставить реализацию IDisposable.Dispose для обеспечения определенного освобождения неуправляемых ресурсов. Потребитель вашего типа вызывает Dispose, когда объект (и используемые ресурсы) больше не нужны. Метод Dispose немедленно освобождает неуправляемые ресурсы.

  • В случае, если потребитель данного типа забудет вызвать Dispose, предоставьте способ освобождения неуправляемых ресурсов. Это можно сделать двумя способами.

    • Используйте безопасный дескриптор для упаковки неуправляемого ресурса. Это рекомендуемый метод. Безопасные дескрипторы являются производными от абстрактного класса System.Runtime.InteropServices.SafeHandle и включают надежный метод Finalize. При использовании безопасного дескриптора вы просто реализуете интерфейс IDisposable и вызываете метод Dispose вашего безопасного дескриптора в своей реализации IDisposable.Dispose. Финализатор безопасного дескриптора вызывается автоматически сборщиком мусора, если метод Dispose не вызывается.

      или

    • Определите метод завершения. Завершение позволяет выпускать неуправляемые ресурсы недетерминированным образом, когда потребитель типа не вызывает IDisposable.Dispose, чтобы их детерминированно освободить.

      Предупреждение

      Завершение объектов может быть сложной и подверженной ошибкам операции, рекомендуется использовать безопасный дескриптор вместо предоставления собственного средства завершения.

Потребители вашего типа могут непосредственно вызывать реализацию IDisposable.Dispose, чтобы освободить память, используемую неуправляемыми ресурсами. При правильной Dispose реализации метода либо метод безопасного дескриптора Finalize, либо собственное переопределение метода Object.Finalize становится способом очистки ресурсов в случае, если метод Dispose не вызывается.

В этом разделе

Реализация метода Dispose описывает, как реализовать шаблон удаления для освобождения неуправляемых ресурсов.

Использование объектов, реализующих IDisposable описывает, как потребители типа обеспечивают вызов его Dispose реализации. Для этого настоятельно рекомендуется использовать инструкцию C# using (или Visual Basic Using).

Справка

Тип / член Описание
System.IDisposable Определяет Dispose метод для освобождения неуправляемых ресурсов.
Object.Finalize Обеспечивает завершение объекта, если неуправляемые ресурсы не освобождаются методом Dispose .
GC.SuppressFinalize Подавляет финализацию. Этот метод обычно вызывается из метода Dispose, чтобы предотвратить выполнение финализатора.