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


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

Свойство Значение
Идентификатор правила CA2216
Заголовок Высвобождаемые типы должны объявлять методы завершения
Категория Использование
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 9 No

Причина

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

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

Нарушение этого правила происходит, если удаляемый тип содержит поля следующих типов:

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

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

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

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

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

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

#pragma warning disable CA2216
// The code that's violating the rule is on this line.
#pragma warning restore CA2216

Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.

[*.{cs,vb}]
dotnet_diagnostic.CA2216.severity = none

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.

Пример

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

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);
    // }
}

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

См. также