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: типы, которым принадлежат освобождаемые поля, должны быть освобождаемыми
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по