CA1001: типы, которым принадлежат освобождаемые поля, должны быть освобождаемыми
TypeName |
TypesThatOwnDisposableFieldsShouldBeDisposable |
CheckId |
CA1001 |
Категория |
Microsoft.Design |
Критическое изменение |
Не критическое — если тип недоступен для кода за пределами сборки. Критическое — если тип доступен для кода за пределами сборки. |
Причина
В классе объявляется и реализуется поле экземпляра, которое принадлежит типу System.IDisposable, однако класс не реализует интерфейс IDisposable.
Описание правила
Класс реализует интерфейс IDisposable для удаления принадлежащих ему неуправляемых ресурсов. Принадлежность поля экземпляра типу IDisposable означает, что данное поле владеет неуправляемым ресурсом. Класс, в котором объявляется поле IDisposable, неявно владеет неуправляемым ресурсом и должен реализовывать интерфейс IDisposable. Если класс явным образом не владеет управляемыми ресурсами, он не должен реализовывать метод завершения.
Устранение нарушений
Чтобы устранить нарушение данного правила, реализуйте IDisposable и вызовите из метода IDisposable.Dispose метод Dispose поля.
Отключение предупреждений
Для этого правила отключать вывод предупреждений не следует.
Пример
В следующем примере показан класс, который нарушает данное правило, и класс, удовлетворяющий правилу благодаря реализации интерфейса IDisposable. Класс не реализует метод завершения, поскольку не владеет управляемыми ресурсами явным образом.
Imports System
Imports System.IO
Namespace DesignLibrary
' This class violates the rule.
Public Class NoDisposeMethod
Dim newFile As FileStream
Sub New()
newFile = New FileStream("c:\temp.txt", FileMode.Open)
End Sub
End Class
' This class satisfies the rule.
Public Class HasDisposeMethod
Implements IDisposable
Dim newFile As FileStream
Sub New()
newFile = New FileStream("c:\temp.txt", FileMode.Open)
End Sub
Overloads Protected Overridable Sub Dispose(disposing As Boolean)
If disposing Then
' dispose managed resources
newFile.Close()
End If
' free native resources
End Sub 'Dispose
Overloads Public Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub 'Dispose
End Class
End Namespace
using System;
using System.IO;
namespace DesignLibrary
{
// This class violates the rule.
public class NoDisposeMethod
{
FileStream newFile;
public NoDisposeMethod()
{
newFile = new FileStream(@"c:\temp.txt", FileMode.Open);
}
}
// This class satisfies the rule.
public class HasDisposeMethod: IDisposable
{
FileStream newFile;
public HasDisposeMethod()
{
newFile = new FileStream(@"c:\temp.txt", FileMode.Open);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// dispose managed resources
newFile.Close();
}
// free native resources
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
}
Связанные правила
CA2213: следует высвобождать высвобождаемые поля
CA2216: высвобождаемые типы должны объявлять метод завершения
CA2215: методы Dispose должны вызывать такие же методы базового класса
CA1049: типы, которым принадлежат собственные ресурсы, должны быть высвобождаемыми