CA1305: Zadejte IFormatProvider

Vlastnost Hodnota
ID pravidla CA1305
Název Určete IFormatProvider
Kategorie Globalizace
Oprava je buď způsobující chybu, nebo nezpůsobující chybu Nenarušující
Povoleno ve výchozím nastavení v .NET 10 Ne
Příslušné jazyky C# a Visual Basic

Příčina

Je provedeno volání na metodu, která má přetížení přijímající System.IFormatProvider argument, ale toto přetížení není voláno.

Toto pravidlo ignoruje volání metod .NET, které jsou zdokumentované jako ignorování parametru IFormatProvider . Pravidlo také ignoruje následující metody:

Popis pravidla

System.Globalization.CultureInfo Pokud není zadán objekt System.Globalization.CultureInfo nebo , výchozí hodnota určená přetíženým členem nemusí mít ve všech národních prostředích takový účinek, jaký byste si přáli. Členové .NET také volí výchozí jazykovou verzi a formátování na základě předpokladů, které nemusí být pro váš kód správné. Abyste měli jistotu, že kód funguje podle očekávání pro vaše scénáře, měli byste zadat informace specifické pro kulturu podle následujících pokynů:

  • Pokud se uživateli zobrazí hodnota, použijte aktuální jazyk. Podívejte se na CultureInfo.CurrentCulture.

  • Pokud bude hodnota uložená a přistupovaná softwarem (trvale uložená v souboru nebo databázi), použijte invariantní jazykové nastavení. Podívejte se na CultureInfo.InvariantCulture.

  • Pokud neznáte, kam se má hodnota dále distribuovat, požádejte příjemce nebo poskytovatele dat, aby určili jazykovou verzi.

I když je výchozí chování přetíženého členu vhodné pro vaše potřeby, je lepší explicitně volat přetížení specifické pro jazykovou verzi, aby byl váš kód samodokumentační a snadněji udržovatelný.

Jak opravit porušení

Chcete-li opravit porušení tohoto pravidla, použijte přetížení, které přebírá IFormatProvider argument. Nebo pokud chcete použít invariantní jazykové prostředí, použijte interpolovaný řetězec jazyka C# a předejte ho String.Create(IFormatProvider, DefaultInterpolatedStringHandler) spolu s CultureInfo.InvariantCulture, například:

string.Create(CultureInfo.InvariantCulture, $"{major}.{minor}.{build}.{revision}");

Kdy potlačit upozornění

Je bezpečné potlačit upozornění z tohoto pravidla, pokud je jisté, že výchozí formát je správnou volbou a kde udržovatelnost kódu není důležitou prioritou vývoje.

Potlačení upozornění

Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.

#pragma warning disable CA1305
// The code that's violating the rule is on this line.
#pragma warning restore CA1305

Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.

[*.{cs,vb}]
dotnet_diagnostic.CA1305.severity = none

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

Konfigurace kódu pro analýzu

Pomocí následujících možností můžete nakonfigurovat, pro které části základu kódu se má toto pravidlo spouštět.

Tyto možnosti můžete nakonfigurovat pouze pro toto pravidlo, pro všechna pravidla, která platí pro, nebo pro všechna pravidla v této kategorii (globalizace), na která se vztahují. Další informace naleznete v tématu Možnosti konfigurace pravidla kvality kódu.

Vyloučení konkrétních symbolů

Z analýzy můžete vyloučit konkrétní symboly, jako jsou typy a metody, nastavením možnosti excluded_symbol_names. Pokud chcete například určit, že pravidlo by se nemělo spouštět u žádného kódu v rámci pojmenovaných MyTypetypů, přidejte do souboru .editorconfig v projektu následující dvojici klíč-hodnota:

dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType

Poznámka

Nahraďte část XXXXCAXXXX s ID toho příslušného pravidla.

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

  • Pouze název symbolu (zahrnuje všechny symboly s názvem bez ohledu na typ nebo obor názvů).
  • Plně kvalifikované názvy ve formátu dokumentačního ID symbolu. Každý název symbolu vyžaduje předponu typu symbolu, například M: pro metody, T: typy a N: obory názvů.
  • .ctor pro konstruktory a .cctor statické konstruktory.

Příklady:

Hodnota možnosti Shrnutí
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType Odpovídá všem symbolům s názvem MyType.
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 Porovná všechny symboly pojmenované buď MyType1 nebo MyType2.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) Odpovídá konkrétní metodě MyMethod se zadaným plně kvalifikovaným podpisem.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) Odpovídá konkrétním metodám MyMethod1 a MyMethod2 příslušným plně kvalifikovaným podpisům.

Vyloučení konkrétních typů a jejich odvozených typů

Konkrétní typy a jejich odvozené typy můžete vyloučit z analýzy nastavením možnosti excluded_type_names_with_derived_types. Pokud chcete například určit, že pravidlo by se nemělo spouštět u žádné metody v rámci pojmenovaných MyType typů a jejich odvozených typů, přidejte do souboru .editorconfig v projektu následující dvojici klíč-hodnota:

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType

Poznámka

Nahraďte část XXXXCAXXXX s ID toho příslušného pravidla.

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

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

Příklady:

Hodnota možnosti Shrnutí
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType Odpovídá všem pojmenovaným MyType typům a všem jejich odvozeným typům.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 Odpovídá všem typům pojmenovaným buď MyType1 nebo MyType2 a všem jejich odvozeným typům.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType Odpovídá určitému typu MyType s daným plně kvalifikovaným názvem a všemi jeho odvozenými typy.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 Odpovídá konkrétním typům MyType1 a MyType2 příslušným plně kvalifikovaným názvům a všem jejich odvozeným typům.

Příklad

V následujícím kódu example1 řetězec porušuje pravidlo CA1305. Řetězec example2 splňuje pravidlo CA1305 předáním CultureInfo.CurrentCulture, který implementuje IFormatProvider, do String.Format(IFormatProvider, String, Object). Řetězec example3 splňuje pravidlo CA1305 předáním interpolovaného řetězce spolu s String.Create(IFormatProvider, DefaultInterpolatedStringHandler) a CultureInfo.InvariantCulture.

string name = "Georgette";

// Violates CA1305
string example1 = string.Format("Hello {0}", name);

// Satisfies CA1305
string example2 = string.Format(CultureInfo.CurrentCulture, "Hello {0}", name);

// Satisfies CA1305
string example3 = string.Create(CultureInfo.InvariantCulture, $"Hello {name}");

Viz také