CA2241 : Indiquer le nombre correct d'arguments dans les méthodes de mise en forme

Propriété Value
Identificateur de la règle CA2241
Titre Indiquer le nombre correct d'arguments dans les méthodes de mise en forme
Catégorie Utilisation
Le correctif est cassant ou non cassant Sans rupture
Activé par défaut dans .NET 8 À titre de suggestion

Cause

L’argument de chaîne format passé à une méthode comme WriteLine, Write ou System.String.Format ne contient pas d’élément de format qui correspond à chaque argument d’objet, ou inversement.

Par défaut, cette règle analyse uniquement les appels aux trois méthodes mentionnées précédemment, mais cela est configurable.

Description de la règle

Les arguments des méthodes, comme WriteLine, Write et Format se composent d’une chaîne de format suivie de plusieurs instances de System.Object. La chaîne de format se compose de texte et d’éléments de format incorporés de la forme {index[,alignment][:formatString]}. ’index’ est un entier de base zéro qui indique les objets à mettre en forme. Si un objet n’a pas d’index correspondant dans la chaîne de format, l’objet est ignoré. Si l’objet spécifié par ’index’ n’existe pas, une System.FormatException est levée au moment de l’exécution.

Comment corriger les violations

Pour corriger une violation de cette règle, fournissez un élément de format pour chaque argument d’objet, et fournissez un argument objet pour chaque élément de format.

Quand supprimer les avertissements

Ne supprimez aucun avertissement de cette règle.

Configurer le code à analyser

Utilisez les options suivantes pour configurer des méthodes supplémentaires pour exécuter cette règle.

Méthodes de mise en forme de chaîne supplémentaires

Vous pouvez configurer les noms des méthodes de mise en forme de chaîne supplémentaires qui doivent être analysées par cette règle. Par exemple, pour spécifier toutes les méthodes nommées MyFormat en tant que méthodes de mise en forme de chaîne, vous pouvez ajouter la paire clé-valeur suivante à un fichier .editorconfig dans votre projet :

dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat

Formats de nom de méthode autorisés dans la valeur d’option (séparés par |) :

  • Nom de la méthode uniquement (inclut toutes les méthodes portant le nom, quel que soit le type ou l’espace de noms conteneur)
  • Noms qualifiés complets au format d’ID de documentation du symbole, avec un préfixe M: facultatif.

Exemples :

Valeur d’option Récapitulatif
dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat Correspond à toutes les méthodes nommées MyFormat dans la compilation.
dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat1|MyFormat2 Correspond à toutes les méthodes nommées MyFormat1 ou MyFormat2 dans la compilation.
dotnet_code_quality.CA2241.additional_string_formatting_methods = NS.MyType.MyFormat(ParamType) Correspond à une méthode MyFormat donnée avec une signature complète donnée.
dotnet_code_quality.CA2241.additional_string_formatting_methods = NS1.MyType1.MyFormat1(ParamType)|NS2.MyType2.MyFormat2(ParamType) Correspond à des méthodes MyFormat1 spécifiques et MyFormat2 avec une signature complète respective.

Déterminer automatiquement des méthodes de mise en forme de chaîne supplémentaires

Au lieu de spécifier une liste explicite de méthodes de mise en forme de chaîne supplémentaires, vous pouvez configurer l’analyseur pour qu’il tente automatiquement de déterminer la méthode de mise en forme de chaîne. Par défaut, cette option est désactivée. Si l’option est activée, toute méthode ayant un paramètre string format suivi d’un paramètre params object[] est considérée comme une méthode de mise en forme de chaîne :

dotnet_code_quality.CA2241.try_determine_additional_string_formatting_methods_automatically = true

Exemple

L’exemple suivant montre deux violations de la règle.

Imports System

Namespace ca2241

    Class CallsStringFormat

        Sub CallFormat()

            Dim file As String = "file name"
            Dim errors As Integer = 13

            ' Violates the rule.
            Console.WriteLine(String.Format("{0}", file, errors))

            Console.WriteLine(String.Format("{0}: {1}", file, errors))

            ' Violates the rule and generates a FormatException at runtime.
            Console.WriteLine(String.Format("{0}: {1}, {2}", file, errors))

        End Sub

    End Class

End Namespace
class CallsStringFormat
{
    void CallFormat()
    {
        string file = "file name";
        int errors = 13;

        // Violates the rule.
        Console.WriteLine(string.Format("{0}", file, errors));

        Console.WriteLine(string.Format("{0}: {1}", file, errors));

        // Violates the rule and generates a FormatException at runtime.
        Console.WriteLine(string.Format("{0}: {1}, {2}", file, errors));
    }
}