Share via


CA2241: Ange rätt argument för formateringsmetoder

Property Värde
Regel-ID CA2241
Title Ange rätt argument för formateringsmetoder
Kategori Användning
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Som förslag

Orsak

Strängargumentet format som skickas till en metod som WriteLine, Writeeller System.String.Format innehåller inte ett formatobjekt som motsvarar varje objektargument eller vice versa.

Som standard analyserar den här regeln endast anrop till de tre metoder som nämnts tidigare, men detta kan konfigureras.

Regelbeskrivning

Argumenten till metoder som WriteLine, Writeoch Format består av en formatsträng följt av flera System.Object instanser. Formatsträngen består av text och inbäddade formatobjekt i formuläret {index[,alignment][:formatString]}. "index" är ett nollbaserat heltal som anger vilket av objekten som ska formateras. Om ett objekt inte har något motsvarande index i formatsträngen ignoreras objektet. Om objektet som anges av "index" inte finns genereras ett System.FormatException vid körning.

Så här åtgärdar du överträdelser

Om du vill åtgärda en överträdelse av den här regeln anger du ett formatobjekt för varje objektargument och anger ett objektargument för varje formatobjekt.

När du ska ignorera varningar

Ignorera inte en varning från den här regeln.

Konfigurera kod för analys

Använd följande alternativ för att konfigurera ytterligare metoder för att köra den här regeln på.

Ytterligare strängformateringsmetoder

Du kan konfigurera namn på ytterligare strängformateringsmetoder som ska analyseras av den här regeln. Om du till exempel vill ange alla metoder med namnet MyFormat som strängformateringsmetoder kan du lägga till följande nyckel/värde-par i en .editorconfig-fil i projektet:

dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat

Tillåtna metodnamnformat i alternativvärdet (avgränsade med |):

  • Endast metodnamn (innehåller alla metoder med namnet, oavsett vilken typ eller namnrymd som finns)
  • Fullständigt kvalificerade namn i symbolens dokumentations-ID-format, med ett valfritt M: prefix.

Exempel:

Alternativvärde Sammanfattning
dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat Matchar alla metoder med namnet MyFormat i kompilering.
dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat1|MyFormat2 Matchar alla metoder med namnet antingen MyFormat1 eller MyFormat2 i kompilering.
dotnet_code_quality.CA2241.additional_string_formatting_methods = NS.MyType.MyFormat(ParamType) Matchar en specifik metod MyFormat med en given fullständigt kvalificerad signatur.
dotnet_code_quality.CA2241.additional_string_formatting_methods = NS1.MyType1.MyFormat1(ParamType)|NS2.MyType2.MyFormat2(ParamType) Matchar specifika metoder MyFormat1 och MyFormat2 med respektive fullständigt kvalificerade signatur.

Fastställa ytterligare strängformateringsmetoder automatiskt

I stället för att ange en explicit lista över ytterligare strängformateringsmetoder kan du konfigurera analysatorn så att den automatiskt försöker fastställa strängformateringsmetoden. Det här alternativet är inaktiverat som standard. Om alternativet är aktiverat betraktas alla metoder som har en string format parameter följt av en params object[] parameter som en strängformateringsmetod:

dotnet_code_quality.CA2241.try_determine_additional_string_formatting_methods_automatically = true

Exempel

I följande exempel visas två överträdelser av regeln.

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