CA1001: Typen, die löschbare Felder besitzen, müssen gelöscht werden können
TypeName |
TypesThatOwnDisposableFieldsShouldBeDisposable |
CheckId |
CA1001 |
Kategorie (Category) |
Microsoft.Design |
Unterbrechende Änderung |
Nicht unterbrechend – Wenn der Typ nicht außerhalb der Assembly sichtbar ist. Unterbrechend – Wenn der Typ außerhalb der Assembly sichtbar ist. |
Ursache
Eine Klasse deklariert und implementiert ein Instanzenfeld, das den IDisposable-Typ aufweist, implementiert jedoch IDisposable nicht.
Regelbeschreibung
Eine Klasse implementiert die IDisposable-Schnittstelle, um nicht verwaltete Ressourcen, die sie besitzt, zu entfernen.Ein Instanzenfeld, das den IDisposable-Typ aufweist, gibt an, dass das Feld eine nicht verwaltete Ressource besitzt.Eine Klasse, die ein IDisposable-Feld deklariert, besitzt indirekt eine nicht verwaltete Ressource und sollte die IDisposable-Schnittstelle implementieren.Wenn die Klasse keine nicht verwalteten Ressourcen direkt besitzt, sollte sie keinen Finalizer implementieren.
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, implementieren Sie IDisposable, und rufen Sie in der IDisposable.Dispose-Methode die Dispose-Methode des Felds auf.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie keine Warnung dieser Regel.
Beispiel
Das folgende Beispiel zeigt eine Klasse, die gegen die Regel verstößt, und eine Klasse, die der Regel durch die Implementierung von IDisposable entspricht.Die Klasse implementiert keinen Finalizer, da sie direkt keine nicht verwalteten Ressourcen besitzt.
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);
}
}
}
Verwandte Regeln
CA2213: Verwerfbare Felder verwerfen
CA2216: Verwerfbare Typen sollten einen Finalizer deklarieren
CA2215: Dispose-Methoden müssen die Dispose-Funktion der Basisklasse aufrufen
CA1049: Typen, die systemeigene Ressourcen besitzen, müssen gelöscht werden können