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

Для большинства объектов, создаваемых приложением, управление памятью осуществляется сборщиком мусора .NET.For the majority of the objects that your app creates, you can rely on the .NET 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. Основным типом неуправляемых ресурсов являются объекты, заключающие ресурсы операционной системы, такие как файлы, окна, сетевые подключения и подключения к базам данным.The most common types of unmanaged resources 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) are no longer needed. Метод Dispose немедленно освобождает неуправляемые ресурсы.The Dispose method immediately releases the unmanaged resources.

  • Предусмотрите способ освобождения неуправляемых ресурсов, если метод Dispose не будет вызван объектом-получателем.In the event that a consumer of your type forgets to call Dispose, provide a way for your unmanaged resources to be released. Это можно сделать двумя способами.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 abstract 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. Определите метод завершения, переопределив метод Object.Finalize.Define a finalizer by overriding the Object.Finalize method.

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

    Но так как завершение объекта может быть сложной операцией с высокой вероятностью возникновения ошибок, мы рекомендуем использовать безопасный дескриптор, а не указывать собственный метод завершения.However, because object finalization can be a complex and an 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 (or the Visual Basic Using) statement to do this.

СправочникReference

Тип или членType / Member ОписаниеDescription
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.