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

Для большинства объектов, создаваемых приложением, управление памятью осуществляется сборщиком мусора .NET.For the majority of the objects that your app creates, you can rely on .NET's garbage collector to handle memory management. Однако при создании объектов, которые включают неуправляемые ресурсы, после использования неуправляемых ресурсов в приложении необходимо освобождать их явно.However, when you create objects that include unmanaged resources, you must explicitly release those resources when you finish using them in your app. Основным типом неуправляемых ресурсов являются объекты, заключающие в себе ресурсы операционной системы, такие как файлы, окна, сетевые подключения и подключения к базам данным.The most common types of unmanaged resource are objects that wrap operating system resources, such as files, windows, network connections, or database connections. Хотя сборщик мусора может отслеживать время жизни управляемого объекта, инкапсулирующего неуправляемые ресурсы, он не имеет сведений о том, как освобождать такие ресурсы.Although the garbage collector is able to track the lifetime of an object that encapsulates an unmanaged resource, it doesn't know how to release and clean up the unmanaged resource.

Если ваши типы используют неуправляемые ресурсы, необходимо выполнить следующие действия:If your types use unmanaged resources, you should do the following:

  • Реализуйте шаблон удаления.Implement the dispose pattern. Это требует реализации IDisposable.Dispose для детерминированного освобождения неуправляемых ресурсов.This requires that you provide an IDisposable.Dispose implementation to enable the deterministic release of unmanaged resources. Объект-получатель типа вызывает метод Dispose, когда объект и используемые им ресурсы больше не нужны.A consumer of your type calls Dispose when the object (and the resources it uses) is no longer needed. Метод Dispose немедленно освобождает неуправляемые ресурсы.The Dispose method immediately releases the unmanaged resources.

  • Предусмотрите освобождение неуправляемых ресурсов, в случае если метод Dispose не будет вызван объектом-получателем.Provide for your unmanaged resources to be released in the event that a consumer of your type forgets to call Dispose. Это можно сделать двумя способами.There are two ways to do this:

    • Используйте безопасный дескриптор в качестве оболочки для неуправляемого ресурса.Use a safe handle to wrap your unmanaged resource. Это рекомендуемая методика.This is the recommended technique. Безопасные дескрипторы являются производными от класса System.Runtime.InteropServices.SafeHandle. Они включают надежный метод Finalize.Safe handles are derived from the System.Runtime.InteropServices.SafeHandle class and include a robust Finalize method. При использовании безопасного дескриптора нужно просто реализовать интерфейс IDisposable и вызвать метод Dispose этого безопасного дескриптора в реализации IDisposable.Dispose.When you use a safe handle, you simply implement the IDisposable interface and call your safe handle's Dispose method in your IDisposable.Dispose implementation. Метод завершения безопасного дескриптора автоматически вызывается сборщиком мусора, если не вызывается метод Dispose.The safe handle's finalizer is called automatically by the garbage collector if its Dispose method is not called.

      —или——or—

    • Переопределите метод Object.Finalize .Override the Object.Finalize method. Завершение включает недетерминированное освобождение неуправляемых ресурсов, когда объекту-получателю типа не удается вызвать метод IDisposable.Dispose для их детерминированного удаления.Finalization enables the non-deterministic release of unmanaged resources when the consumer of a type fails to call IDisposable.Dispose to dispose of them deterministically. Однако поскольку завершение объекта может быть сложной операцией с высокой вероятностью ошибок, рекомендуется использовать безопасный дескриптор вместо указания собственного метода завершения.However, because object finalization can be a complex and error-prone operation, we recommend that you use a safe handle instead of providing your own finalizer.

Объекты-получатели типа могут затем вызвать реализацию IDisposable.Dispose непосредственно для освобождения памяти, используемой неуправляемыми ресурсами.Consumers of your type can then call your IDisposable.Dispose implementation directly to free memory used by unmanaged resources. При правильной реализации метода Dispose метод Finalize или переопределенная версия метода Object.Finalize становятся резервным средством очистки ресурсов в случае, если не вызывается метод Dispose.When you properly implement a Dispose method, either your safe handle's Finalize method or your own override of the Object.Finalize method becomes a safeguard to clean up resources in the event that the Dispose method is not called.

В этом разделеIn This Section

Реализация метода Dispose — описание способа реализации шаблона удаления для освобождения неуправляемых ресурсов.Implementing a Dispose Method Describes how to implement the dispose pattern for releasing unmanaged resources.

Использование объектов, реализующих IDisposable — описание того, как объекты-получатели типа обеспечивают вызов своей реализации метода Dispose.Using Objects That Implement IDisposable Describes how consumers of a type ensure that its Dispose implementation is called. Для этого рекомендуется использовать оператор using (C# ) или Using (Visual Basic).We recommend using the C# using statement or the Visual Basic Using statement to do this.

СправочникиReference

System.IDisposable
Определяет метод Dispose для освобождения неуправляемых ресурсов.Defines the Dispose method for releasing unmanaged resources.

Object.Finalize
Предусматривает завершение объекта, если неуправляемые ресурсы не освобождены методом Dispose.Provides for object finalization if unmanaged resources are not released by the Dispose method.

GC.SuppressFinalize
Отключает завершение.Suppresses finalization. Этот метод обычно вызывается из метода Dispose, чтобы не допустить выполнения метода завершения.This method is customarily called from a Dispose method to prevent a finalizer from executing.