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

Для большинства объектов, создаваемых приложением, можно использовать сборщик мусора .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, чтобы не допустить выполнения метода завершения.