CA2216: высвобождаемые типы должны объявлять метод завершения
TypeName |
DisposableTypesShouldDeclareFinalizer |
CheckId |
CA2216 |
Категория |
Microsoft.Usage |
Критическое изменение |
Не критическое |
Причина
Тип, который реализует 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: типы, которым принадлежат собственные ресурсы, должны быть высвобождаемыми