CA2241: Poskytněte správné argumenty metodě formátování

Vlastnost Hodnota
ID pravidla CA2241
Název Zadejte správné argumenty pro metody formátování
Kategorie Využití
Oprava způsobující chybu nebo chybu způsobující chybu Nenarušující
Povoleno ve výchozím nastavení v .NET 8 Jako návrh

Příčina

Řetězcový format argument předaný metodě, například WriteLine, Writenebo System.String.Format neobsahuje položku formátu, která odpovídá každému argumentu objektu, nebo naopak.

Ve výchozím nastavení toto pravidlo analyzuje pouze volání tří dříve zmíněných metod, ale dá se nakonfigurovat.

Popis pravidla

Argumenty pro metody, jako WriteLineje , Writea Format skládají se z formátovací řetězec následovaný několika System.Object instancemi. Formátovací řetězec se skládá z textových a vložených formátových položek formuláře {index[,alignment][:formatString]}. Index je celé číslo založené na nule, které označuje, které objekty se mají formátovat. Pokud objekt nemá odpovídající index ve formátovacím řetězci, bude objekt ignorován. Pokud objekt určený indexem neexistuje, System.FormatException vyvolá se za běhu.

Jak opravit porušení

Chcete-li opravit porušení tohoto pravidla, zadejte položku formátu pro každý argument objektu a zadejte argument objektu pro každou položku formátu.

Kdy potlačit upozornění

Nepotlačujte upozornění na toto pravidlo.

Konfigurace kódu pro analýzu

Pomocí následujících možností můžete nakonfigurovat další metody pro spuštění tohoto pravidla.

Další metody formátování řetězců

Můžete nakonfigurovat názvy dalších metod formátování řetězců, které by měly být analyzovány tímto pravidlem. Pokud chcete například zadat všechny metody pojmenované MyFormat jako metody formátování řetězců, můžete do souboru .editorconfig v projektu přidat následující pár klíč-hodnota:

dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat

Povolené formáty názvů metod v hodnotě možnosti (oddělené ):|

  • Pouze název metody (zahrnuje všechny metody s názvem bez ohledu na typ nebo obor názvů)
  • Plně kvalifikované názvy ve formátu ID dokumentace symbolu s volitelnou M: předponou.

Příklady:

Hodnota možnosti Shrnutí
dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat Odpovídá všem metodám pojmenovanými MyFormat v kompilaci.
dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat1|MyFormat2 Porovná všechny metody pojmenované buď MyFormat1 nebo MyFormat2 v kompilaci.
dotnet_code_quality.CA2241.additional_string_formatting_methods = NS.MyType.MyFormat(ParamType) Odpovídá konkrétní metodě MyFormat s daným plně kvalifikovaným podpisem.
dotnet_code_quality.CA2241.additional_string_formatting_methods = NS1.MyType1.MyFormat1(ParamType)|NS2.MyType2.MyFormat2(ParamType) Odpovídá konkrétním metodám MyFormat1 a MyFormat2 s příslušným plně kvalifikovaným podpisem.

Automatické určení dalších metod formátování řetězců

Místo zadávání explicitního seznamu dalších metod formátování řetězců můžete nakonfigurovat analyzátor tak, aby se automaticky pokusil určit metodu formátování řetězce. Ve výchozím nastavení je tato možnost zakázaná. Pokud je tato možnost povolená, považuje se za metodu string format formátování řetězce jakákoli metoda s parametrem, za kterou params object[] následuje parametr:

dotnet_code_quality.CA2241.try_determine_additional_string_formatting_methods_automatically = true

Příklad

Následující příklad ukazuje dvě porušení pravidla.

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