CA1001 : Les types qui possèdent des champs supprimables doivent être supprimables
Propriété | Value |
---|---|
Identificateur de la règle | CA1001 |
Titre | Les types qui possèdent des champs supprimables doivent être supprimables |
Catégorie | Conception |
Le correctif est cassant ou non cassant | Non cassant : Si le type n’est pas visible en dehors de l’assembly. Cassant : Si le type est visible en dehors de l’assembly. |
Activée par défaut dans .NET 9 | Non |
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.
Par défaut, cette règle analyse l’intégralité du codebase, mais elle est configurable.
Description de la règle
Une classe qui déclare un champ IDisposable est indirectement propriétaire d’une ressource non managée. La classe doit implémenter l’interface IDisposable pour supprimer la ressource non managée dont elle est propriétaire une fois que la ressource n’est plus utilisée. Si la classe n’est directement propriétaire d’aucune ressource non managée, elle ne doit pas implémenter de finaliseur.
Cette règle respecte les types implémentant System.IAsyncDisposable en tant que types supprimables.
Comment corriger les violations
Pour corriger une violation de cette règle, implémentez l’interface IDisposable. Dans la méthode IDisposable.Dispose, appelez la méthode Dispose du type du champ.
Quand supprimer les avertissements
En général, ne supprimez aucun avertissement de cette règle. Vous pouvez supprimer l’avertissement lorsque la propriété de suppression du champ n’est pas détenue par le type conteneur.
Supprimer un avertissement
Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.
#pragma warning disable CA1001
// The code that's violating the rule is on this line.
#pragma warning restore CA1001
Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none
dans le fichier de configuration.
[*.{cs,vb}]
dotnet_diagnostic.CA1001.severity = none
Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.
Configurer le code à analyser
Utilisez l’option suivante pour configurer les parties de votre codebase sur lesquelles exécuter cette règle.
Vous pouvez configurer toutes ces options pour cette règle uniquement, pour toutes les règles auxquelles elles s’appliquent ou pour toutes les règles de cette catégorie (Conception) auxquelles elles s’appliquent. Pour plus d’informations, consultez Options de configuration des règles de qualité du code.
Exclure des symboles spécifiques
Vous pouvez exclure de l’analyse des symboles spécifiques, comme des types et des méthodes. Par exemple, pour spécifier que la règle ne doit pas s’exécuter sur du code dans des types nommés MyType
, ajoutez la paire clé-valeur suivante à un fichier .editorconfig dans votre projet :
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Formats de nom de symbole autorisés dans la valeur d’option (séparés par |
) :
- Nom du symbole uniquement (inclut tous les symboles avec le nom, quel que soit le type ou l’espace de noms qui les contient).
- Noms qualifiés complets au format d’ID de documentation du symbole. Chaque nom de symbole nécessite un préfixe de type symbole, comme
M:
pour les méthodes,T:
pour les types etN:
pour les espaces de noms. .ctor
pour les constructeurs et.cctor
pour les constructeurs statiques.
Exemples :
Valeur d’option | Récapitulatif |
---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
Correspond à tous les symboles nommés MyType . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
Correspond à tous les symboles nommés MyType1 ou MyType2 . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
Correspond à une méthode MyMethod spécifique avec la signature complète spécifiée. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Correspond à des méthodes MyMethod1 et MyMethod2 spécifiques avec la signature complète spécifiée. |
Exclure des types spécifiques et leurs types dérivés
Vous pouvez exclure de l’analyse des types spécifiques et leurs types dérivés. Par exemple, pour spécifier que la règle ne doit s’exécuter sur aucune méthode dans des types nommés MyType
et leurs types dérivés, ajoutez la paire clé-valeur suivante à un fichier .editorconfig dans votre projet :
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Formats de nom de symbole autorisés dans la valeur d’option (séparés par |
) :
- Nom du type uniquement (inclut tous les types avec le nom, quel que soit le type ou l’espace de noms qui les contient).
- Noms qualifiés complets au format d’ID de documentation du symbole, avec un préfixe
T:
facultatif.
Exemples :
Valeur d’option | Récapitulatif |
---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
Correspond à tous les types nommés MyType et à tous leurs types dérivés. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
Correspond à tous les types nommés MyType1 ou MyType2 , et à tous leurs types dérivés. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Correspond à un type MyType spécifique avec un nom complet donné et tous ses types dérivés. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Correspond à des types MyType1 ou MyType2 spécifiques avec leur nom complet respectif et tous leurs types dérivés. |
Exemple
L’exemple suivant montre une classe qui enfreint la règle et une classe 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 ca1001
' 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
Protected Overridable Overloads Sub Dispose(disposing As Boolean)
If disposing Then
' dispose managed resources
newFile.Close()
End If
' free native resources
End Sub 'Dispose
Public Overloads Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub 'Dispose
End Class
End Namespace
// 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 associées
- 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 méthode Dispose de la classe de base