CA1049: типы, которым принадлежат собственные ресурсы, должны быть высвобождаемыми

Товар Значение
Идентификатор правила CA1049
Категория Microsoft.Design
Критическое изменение Не критическое

Причина

Тип ссылается на System.IntPtr поле, System.UIntPtr поле или System.Runtime.InteropServices.HandleRef поле, но не реализует System.IDisposable.

Описание правила

Это правило предполагает, что IntPtrUIntPtr, и HandleRef поля хранят указатели на неуправляемые ресурсы. Типы, которые выделяют неуправляемые ресурсы, должны реализовываться IDisposable , чтобы вызывающие пользователи освобождали эти ресурсы по требованию и сокращали время существования объектов, в которых хранятся ресурсы.

Рекомендуемый шаблон проектирования для очистки неуправляемых ресурсов заключается в предоставлении как неявного, так и явного средства для освобождения этих ресурсов с помощью System.Object.Finalize метода и System.IDisposable.Dispose метода соответственно. Сборщик мусора вызывает Finalize метод объекта в некоторое неопределенное время после того, как объект больше недоступен. После Finalize вызова требуется дополнительная сборка мусора для освобождения объекта. Этот Dispose метод позволяет вызывающей стороне явно освобождать ресурсы по запросу, чем ресурсы будут освобождены, если они останутся в сборщике мусора. После очистки неуправляемых ресурсов следует вызвать System.GC.SuppressFinalize метод, чтобы сборщик мусора знал, Dispose что Finalize больше не нужно вызывать. Это устраняет необходимость дополнительной сборки мусора и сокращает время существования объекта.

Устранение нарушений

Чтобы устранить нарушение этого правила, реализуйте IDisposable.

Когда лучше отключить предупреждения

Если тип не ссылается на неуправляемый ресурс, можно отключить предупреждение из этого правила. В противном случае не подавляйте предупреждение из этого правила, так как неуправляемые IDisposable ресурсы могут стать недоступными или неиспользуемыми.

Пример

В следующем примере показан тип, реализующий IDisposable очистку неуправляемого ресурса.

using System;

namespace DesignLibrary
{
    public class UnmanagedResources : IDisposable
    {
        IntPtr unmanagedResource;
        bool disposed = false;

        public UnmanagedResources() 
        {
            // Allocate the unmanaged resource ...
        }

        public void Dispose() 
        {
            Dispose(true);
            GC.SuppressFinalize(this); 
        }

        protected virtual void Dispose(bool disposing)
        {
            if(!disposed)
            {
                if(disposing)
                {
                    // Release managed resources.
                }

                // Free the unmanaged resource ...

                unmanagedResource = IntPtr.Zero;

                disposed = true;
            }
        }

        ~UnmanagedResources()
        {
            Dispose(false);
        }
    }
}

CA2115: вызывайте GC.KeepAlive при использовании машинных ресурсов

CA1816: вызов GC.SuppressFinalize должен осуществляться правильно

CA2216: высвобождаемые типы должны объявлять метод завершения

CA1001: типы, которым принадлежат освобождаемые поля, должны быть освобождаемыми

См. также