CA2241: Fornire argomenti corretti ai metodi di formattazione

Proprietà valore
ID regola CA2241
Title Specificare argomenti corretti ai metodi di formattazione
Categoria Utilizzo
La correzione causa un'interruzione o meno Non causa un'interruzione
Abilitato per impostazione predefinita in .NET 9 Come suggerimento

Causa

L'argomento format stringa passato a un metodo, ad WriteLineesempio , Writeo System.String.Format non contiene un elemento di formato corrispondente a ogni argomento oggetto o viceversa.

Per impostazione predefinita, questa regola analizza solo le chiamate ai tre metodi indicati in precedenza, ma è configurabile.

Descrizione regola

Gli argomenti di metodi come WriteLine, Writee Format sono costituiti da una stringa di formato seguita da diverse System.Object istanze. La stringa di formato è costituita da elementi di formato di testo e incorporati del modulo {index[,alignment][:formatString]}. 'index' è un intero in base zero che indica quali oggetti sono da formattare. Se un oggetto non dispone di un indice corrispondente nella stringa di formato, l'oggetto viene ignorato. Se l'oggetto specificato da 'index' non esiste, viene generata un'eccezione System.FormatException in fase di esecuzione.

Come correggere le violazioni

Per correggere una violazione di questa regola, specificare un elemento di formato per ogni argomento oggetto e fornire un argomento oggetto per ogni elemento di formato.

Quando eliminare gli avvisi

Non escludere un avviso da questa regola.

Configurare il codice da analizzare

Usare le opzioni seguenti per configurare metodi aggiuntivi per eseguire questa regola.

Metodi di formattazione di stringhe aggiuntivi

È possibile configurare i nomi di metodi di formattazione delle stringhe aggiuntivi che devono essere analizzati da questa regola. Ad esempio, per specificare tutti i metodi denominati MyFormat come metodi di formattazione delle stringhe, è possibile aggiungere la coppia chiave-valore seguente a un file con estensione editorconfig nel progetto:

dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat

I formati dei nomi dei metodi consentiti nel valore dell'opzione (separati da |):

  • Solo nome metodo (include tutti i metodi con il nome, indipendentemente dal tipo o dallo spazio dei nomi contenitore)
  • Nomi completi nel formato ID della documentazione del simbolo, con un prefisso facoltativoM:.

Esempi:

Valore opzione Riepilogo
dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat Corrisponde a tutti i metodi denominati MyFormat nella compilazione.
dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat1|MyFormat2 Corrisponde a tutti i metodi denominati MyFormat1 o MyFormat2 nella compilazione.
dotnet_code_quality.CA2241.additional_string_formatting_methods = NS.MyType.MyFormat(ParamType) Corrisponde a un metodo MyFormat specifico con una firma completa specificata.
dotnet_code_quality.CA2241.additional_string_formatting_methods = NS1.MyType1.MyFormat1(ParamType)|NS2.MyType2.MyFormat2(ParamType) Trova la corrispondenza con metodi MyFormat1 specifici e MyFormat2 con la rispettiva firma completa.

Determinare automaticamente metodi di formattazione di stringhe aggiuntivi

Anziché specificare un elenco esplicito di metodi di formattazione delle stringhe aggiuntivi, è possibile configurare l'analizzatore per tentare automaticamente di determinare il metodo di formattazione delle stringhe. L'opzione è disabilitata per impostazione predefinita. Se l'opzione è abilitata, qualsiasi metodo con un string format parametro seguito da un params object[] parametro viene considerato un metodo di formattazione di stringa:

dotnet_code_quality.CA2241.try_determine_additional_string_formatting_methods_automatically = true

Esempio

Nell'esempio seguente vengono illustrate due violazioni della regola.

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));
    }
}