CA1001: Typy, które posiadają pola usuwalne, powinny być usuwalne
TypeName |
TypesThatOwnDisposableFieldsShouldBeDisposable |
CheckId |
CA1001 |
Kategoria |
Microsoft.Design |
Zmiana kluczowa |
Niekluczowa - Jeśli typ nie jest widoczny na zewnątrz zestawu. Kluczowa - Jeśli typ jest widoczny na zewnątrz zestawu. |
Przyczyna
Klasa deklaruje i implementuje wystąpienie pola, które jest typu IDisposable i klasa nie implementuje IDisposable.
Opis reguły
Klasa implementuje interfejs IDisposable aby zlikwidować niezarządzane zasoby, które do niej należą.Pole wystąpienia, które jest typu IDisposable wskazuje, że to pole posiada niezarządzane zasoby.Klasa, która pośrednio deklaruje pole IDisposable posiada niezarządzane zasoby i powinna implementować interfejs IDisposable.Jeśli klasa nie posiada bezpośrednio niezarządzanych zasobów, nie powinna implementować finalizatora.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, zaimplementuj IDisposable i w metodzie IDisposable.Dispose wywołaj metodę Dispose pola.
Kiedy pominąć ostrzeżenia
Nie pomijaj ostrzeżeń dla tej reguły.
Przykład
Poniższy przykład pokazuje klasę, która narusza regułę i klasę, która zaspokaja regułę przez implementację IDisposable.Klasa nie implementuje finalizatora ponieważ klasa nie posiada bezpośrednio żadnych niezarządzanych zasobów.
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);
}
}
}
Powiązane reguły
CA2213: Pola usuwalne powinny zostać usunięte
CA2216: Typy usuwalne powinny deklarować finalizator
CA2215: Metody Dispose powinny wywoływać operację usuwania klasy podstawowej
CA1049: Typy, które posiadają natywne zasoby powinny być usuwalne