CA1305: IFormatProvider angeben.
Eigenschaft | Wert |
---|---|
Regel-ID | CA1305 |
Titel | IFormatProvider angeben. |
Kategorie | Globalisierung |
Fix führt oder führt nicht zur Unterbrechung | Nicht unterbrechend |
Standardmäßig in .NET 8 aktiviert | Nein |
Ursache
Es wird ein Aufruf an eine Methode mit einer Überladung ausgeführt, die ein System.IFormatProvider-Argument akzeptiert, und diese Überladung wird nicht aufgerufen.
Diese Regel ignoriert Aufrufe von .NET-Methoden, die so dokumentiert sind, dass der IFormatProvider-Parameter ignoriert wird. Die Regel ignoriert auch die folgenden Methoden:
- Activator.CreateInstance
- ResourceManager.GetObject
- ResourceManager.GetString
- Boolean.ToString
- Char.ToString
- Guid.ToString
Regelbeschreibung
Wenn kein System.Globalization.CultureInfo- oder IFormatProvider-Objekt angegeben wird, hat der vom überladenen Member bereitgestellte Standardwert möglicherweise nicht in allen Gebietsschemas den gewünschten Effekt. .NET-Member wählen außerdem Standardkultur und -formatierung basierend auf Annahmen, die für Ihren Code möglicherweise nicht korrekt sind. Um sicherzustellen, dass der Code für Ihre Szenarien erwartungsgemäß funktioniert, sollten Sie kulturspezifische Informationen gemäß den folgenden Richtlinien angeben:
Wenn der Wert für den Benutzer angezeigt wird, verwenden Sie die aktuelle Kultur. Siehe CultureInfo.CurrentCulture.
Wenn der Wert von Software (dauerhaft in einer Datei oder Datenbank) gespeichert wird und darauf zugegriffen wird, verwenden Sie die invariante Kultur. Siehe CultureInfo.InvariantCulture.
Wenn Sie das Ziel des Werts nicht kennen, lassen Sie den Datenconsumer oder Anbieter die Kultur angeben.
Auch wenn das Standardverhalten des überladenen Members für Ihre Anforderungen geeignet ist, empfiehlt es sich, die kulturspezifische Überladung explizit aufzurufen, sodass Ihr Code selbst dokumentierend und leichter zu pflegen ist.
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, müssen Sie die Überladung verwenden, die ein IFormatProvider-Argument annimmt. Wenn Sie stattdessen die invariante Kultur nutzen möchten, verwenden Sie eine interpolierte C#-Zeichenfolge, und übergeben Sie sie zusammen mit CultureInfo.InvariantCulture an String.Create(IFormatProvider, DefaultInterpolatedStringHandler). Zum Beispiel:
string.Create(CultureInfo.InvariantCulture, $"{major}.{minor}.{build}.{revision}");
Wann sollten Warnungen unterdrückt werden?
Es ist sicher, eine Warnung aus dieser Regel zu unterdrücken, wenn sicher ist, dass das Standardformat die richtige Wahl ist und die Code-Wartbarkeit keine wichtige Entwicklungspriorität ist.
Unterdrücken einer Warnung
Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.
#pragma warning disable CA1305
// The code that's violating the rule is on this line.
#pragma warning restore CA1305
Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none
fest.
[*.{cs,vb}]
dotnet_diagnostic.CA1305.severity = none
Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.
Konfigurieren des zu analysierenden Codes
Mithilfe der folgenden Optionen können Sie konfigurieren, für welche Teile Ihrer Codebasis diese Regel ausgeführt werden soll.
Sie können diese Optionen nur für diese Regel, für alle zutreffenden Regeln oder für alle zutreffenden Regeln in dieser Kategorie (Globalisierung) konfigurieren. Weitere Informationen finden Sie unter Konfigurationsoptionen für die Codequalitätsregel.
Ausschließen bestimmter Symbole
Sie können bestimmte Symbole, z. B. Typen und Methoden, von der Analyse ausschließen. Sie können beispielsweise festlegen, dass die Regel nicht für Code innerhalb von Typen namens MyType
ausgeführt werden soll, indem Sie einer EDITORCONFIG-Datei in Ihrem Projekt das folgende Schlüssel-Wert-Paar hinzufügen:
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Zulässige Formate für Symbolnamen im Optionswert (durch |
getrennt):
- Nur Symbolname (schließt alle Symbole mit dem Namen ein, unabhängig vom enthaltenden Typ oder Namespace)
- Vollqualifizierte Namen im Format der Dokumentations-ID des Symbols Jeder Symbolname erfordert ein Symbolartpräfix, z. B.
M:
für Methoden,T:
für Typen undN:
für Namespaces. .ctor
für Konstruktoren und.cctor
für statische Konstruktoren
Beispiele:
Optionswert | Zusammenfassung |
---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
Trifft auf alle Symbole namens MyType zu |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
Trifft auf alle Symbole namens MyType1 oder MyType2 zu |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
Trifft speziell auf die Methode MyMethod mit der angegebenen vollqualifizierten Signatur zu |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Trifft speziell auf die Methoden MyMethod1 und MyMethod2 mit den jeweiligen vollqualifizierten Signaturen zu |
Ausschließen bestimmter Typen und von diesen abgeleiteten Typen
Sie können bestimmte Typen und von diesen abgeleitete Typen aus der Analyse ausschließen. Wenn Sie z. B. festlegen möchten, dass die Regel nicht für Methoden innerhalb von MyType
-Typen und von diesen abgeleiteten Typen ausgeführt werden soll, fügen Sie einer EDITORCONFIG-Datei in Ihrem Projekt das folgende Schlüssel-Wert-Paar hinzu:
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Zulässige Formate für Symbolnamen im Optionswert (durch |
getrennt):
- Nur Typname (schließt alle Typen mit dem Namen ein, unabhängig vom enthaltenden Typ oder Namespace)
- Vollqualifizierte Namen im Dokumentations-ID-Format des Symbols mit einem optionalen Präfix
T:
Beispiele:
Optionswert | Zusammenfassung |
---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
Stimmt mit allen MyType -Typen und allen von diesen abgeleiteten Typen überein. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
Stimmt mit allen MyType1 - oder MyType2 -Typen und allen von diesen abgeleiteten Typen überein. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Stimmt mit einem bestimmten MyType -Typ mit einem angegebenen vollqualifizierten Namen und allen von diesem abgeleiteten Typen überein. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Stimmt mit bestimmten MyType1 - und MyType2 -Typen mit den entsprechenden vollqualifizierten Namen und allen von diesen abgeleiteten Typen überein. |
Beispiel
Im folgenden Code verstößt die example1
-Zeichenfolge gegen die Regel CA1305. Die example2
-Zeichenfolge erfüllt die Regel CA1305 durch Übergeben von CultureInfo.CurrentCulture, der IFormatProvider in String.Format(IFormatProvider, String, Object) implementiert. Die example3
-Zeichenfolge erfüllt die Regel CA1305, indem eine interpolierte Zeichenfolge zusammen mit CultureInfo.InvariantCulture an String.Create(IFormatProvider, DefaultInterpolatedStringHandler) übergeben wird.
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}");