CA1052 : Les types de conteneurs statiques doivent être Static ou NotInheritable

Propriété Value
Identificateur de la règle CA1052
Titre Les types de conteneurs statiques doivent être Static ou NotInheritable
Catégorie Conception
Le correctif est cassant ou non cassant Rupture
Activé par défaut dans .NET 8 Non

Cause

Un type non abstrait contient uniquement des membres statiques (autres qu’un constructeur par défaut possible) et n’est pas déclaré avec le modificateur static ou Shared.

Par défaut, cette règle examine uniquement les types visibles en externe, mais elle est configurable.

Description de la règle

La règle CA1052 part du principe qu’un type qui contient uniquement des membres statiques n’est pas conçu pour être hérité, car le type ne fournit aucune fonctionnalité pouvant être substituée dans un type dérivé. Un type qui n’est pas destiné à être hérité doit être marqué avec le modificateur static en C# afin d’interdire son utilisation comme type de base. En outre, son constructeur par défaut doit être supprimé. En Visual Basic, la classe doit être convertie en module.

Cette règle ne se déclenche pas pour les classes abstraites ou les classes qui ont une classe de base. En revanche, elle se déclenche pour les classes qui prennent en charge une interface vide.

Notes

Dans la dernière implémentation de l’analyseur de cette règle, elle englobe également les fonctionnalités de la règle CA1053.

Comment corriger les violations

Pour corriger une violation de cette règle, marquez le type comme static et supprimez le constructeur par défaut (C#), ou convertissez-le en module (Visual Basic).

Quand supprimer les avertissements

Vous pouvez supprimer les violations dans les cas suivants :

  • Le type est conçu pour être hérité. L’absence du modificateur static suggère que le type est utile en tant que type de base
  • Le type est utilisé comme argument de type. Les types statiques ne peuvent pas être utilisés comme arguments de type

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 CA1052
// The code that's violating the rule is on this line.
#pragma warning restore CA1052

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.CA1052.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 cette option pour cette règle uniquement, pour toutes les règles auxquelles elle s’applique ou pour toutes les règles de cette catégorie (Conception) auxquelles elle s’applique. Pour plus d’informations, consultez Options de configuration des règles de qualité du code.

Inclure des surfaces d’API spécifiques

Vous pouvez configurer les parties de votre codebase sur lesquelles exécuter cette règle, en fonction de leur accessibilité. Par exemple, pour spécifier que la règle doit s’exécuter uniquement sur la surface d’API non publique, ajoutez la paire clé-valeur suivante à un fichier .editorconfig dans votre projet :

dotnet_code_quality.CAXXXX.api_surface = private, internal

Exemple de violation

L’exemple suivant montre un type qui enfreint la règle :

public class StaticMembers
{
    public static int SomeProperty { get; set; }
    public static void SomeMethod() { }
}
Imports System

Namespace ca1052

    Public Class StaticMembers

        Shared Property SomeProperty As Integer

        Private Sub New()
        End Sub

        Shared Sub SomeMethod()
        End Sub

    End Class

End Namespace

Correction avec le modificateur statique

L’exemple suivant montre comment corriger une violation de cette règle en marquant le type avec le modificateur static en C# :

public static class StaticMembers
{
    public static int SomeProperty { get; set; }
    public static void SomeMethod() { }
}