Высвобождаемые типы должны объявлять метод завершения
Обновлен: Ноябрь 2007
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);
// }
}
}
Связанные правила
Вызывайте GC.KeepAlive при использовании машинных ресурсов
Вызов GC.SuppressFinalize должен осуществляться правильно
Типы, которым принадлежат собственные ресурсы, должны быть высвобождаемыми
См. также
Ссылки
Реализация методов Finalize и Dispose для очистки неуправляемых ресурсов