Les types possédant des champs pouvant être supprimés doivent être supprimables
Mise à jour : novembre 2007
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 Dispose du champ à partir de la méthode IDisposable.Dispose.
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 implémente un 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
Les champs pouvant être supprimés doivent l'être
Les types pouvant être supprimés doivent déclarer un finaliseur
Les types qui possèdent des ressources natives doivent être supprimables