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


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

TypeName

DisposableTypesShouldDeclareFinalizer

CheckId

CA2216

Категория

Microsoft.Usage

Критическое изменение

Не критическое

Причина

Тип, который реализует System.IDisposable и имеет поля, предлагающие использование неуправляемых ресурсов, не реализует метод завершения, как описано в Object.Finalize.

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

Если высвобождаемый тип содержит поля, указанных ниже типов, выводится сообщение о нарушении данного правила.

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

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

Отключение предупреждений

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

Пример

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

using System;  
using System.Runtime.InteropServices;

namespace UsageLibrary
{
    public class  DisposeMissingFinalize :IDisposable
    {
        private bool disposed = false;
        private IntPtr unmanagedResource;

        [DllImport("native.dll")]
        private static extern IntPtr AllocateUnmanagedResource();

        [DllImport("native.dll")]
        private static extern void FreeUnmanagedResource(IntPtr p);

        DisposeMissingFinalize()
        {
            unmanagedResource = AllocateUnmanagedResource();
        }

        protected virtual void Dispose(bool disposing) 
        {
            if (!disposed) 
            {
                // Dispose of resources held by this instance.
                FreeUnmanagedResource(unmanagedResource);
                disposed = true;

                // Suppress finalization of this disposed instance.
                if (disposing)
                {
                    GC.SuppressFinalize(this);
                }
            }
        }

        public void Dispose()
        {
            Dispose(true);
        }

        // Disposable types with unmanaged resources implement a finalizer.
        // Uncomment the following code to satisfy rule:
        //  DisposableTypesShouldDeclareFinalizer
        // ~TypeA()
        // {
        //     Dispose(false);
        // }
    }
}

Связанные правила

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

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

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

См. также

Ссылки

Реализация методов Finalize и Dispose для очистки неуправляемых ресурсов

System.IDisposable

System.IntPtr

System.Runtime.InteropServices.HandleRef

System.UIntPtr

Object.Finalize