CA1001 : Les types qui possèdent des champs supprimables doivent être supprimables
TypeName |
TypesThatOwnDisposableFieldsShouldBeDisposable |
CheckId |
CA1001 |
Catégorie |
Microsoft.CSharp |
Modification avec rupture |
Sans rupture - Si le type n'est pas visible à l'extérieur de l'assembly. Avec rupture - Si le type est visible à l'extérieur de l'assembly. |
Cause
Une classe déclare et implémente un champ d'instance qui est un type System.IDisposable et elle n'implémente pas IDisposable.
Description de la règle
Une classe implémente l'interface IDisposable pour supprimer les ressources non managées qu'elle possède. Un champ d'instance qui est un type IDisposable indique que le champ possède une ressource non managée. Une classe qui déclare un champ IDisposable possède indirectement une ressource non managée et doit implémenter l'interface IDisposable. Si la classe ne possède pas directement de ressources non managées, elle ne doit pas implémenter de finaliseur.
Comment corriger les violations
Pour corriger une violation de cette règle, implémentez IDisposable et appelez la méthode IDisposable.Dispose du champ à partir de la méthode Dispose du champ.
Quand supprimer les avertissements
Ne supprimez aucun avertissement de cette règle.
Exemple
L'exemple suivant présente une classe qui viole la règle et une autre qui satisfait à la règle en implémentant IDisposable. La classe n'implémente pas de finaliseur car elle ne possède pas directement de ressources non managées.
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);
}
}
}
Règles connexes
CA2213 : Les champs pouvant être supprimés doivent l'être
CA2216 : Les types pouvant être supprimés doivent déclarer un finaliseur
CA2215 : Les méthodes Dispose doivent appeler la fonction Dispose de la classe de base
CA1049 : Les types qui possèdent des ressources natives doivent être supprimables