Teilen über


CA1304: CultureInfo angeben.

Eigenschaft Wert
Regel-ID CA1304
Titel CultureInfo angeben.
Kategorie Globalisierung
Fix führt oder führt nicht zur Unterbrechung Nicht unterbrechend
Standardmäßig in .NET 8 aktiviert Nein

Ursache

Eine Methode oder ein Konstruktor ruft einen Member auf, der eine Überladung besitzt und einen System.Globalization.CultureInfo-Parameter akzeptiert; die Methode oder der Konstruktor ruft die Überladung nicht auf, die den CultureInfo-Parameter akzeptiert. Diese Regel ignoriert Aufrufe der folgenden Methoden:

Sie können auch weitere Symbole konfigurieren, die von dieser Regel ausgeschlossen werden sollen.

Regelbeschreibung

Wenn ein CultureInfo- oder System.IFormatProvider-Objekt oder ein System.IFormatProvider-Objekt nicht angegeben wird, besitzt 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, der 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 Elements für Ihre Bedürfnisse geeignet ist, ist es besser, die kulturspezifische Überladung explizit aufzurufen, sodass Ihr Code selbst dokumentierend und leichter zu pflegen ist.

Hinweis

CultureInfo.CurrentUICulture wird nur zum Abrufen lokalisierter Ressourcen mithilfe einer Instanz der System.Resources.ResourceManager-Klasse verwendet.

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, müssen Sie die Überladung verwenden, die ein CultureInfo-Argument akzeptiert.

Wann sollten Warnungen unterdrückt werden?

Es ist sicher, eine Warnung aus dieser Regel zu unterdrücken, wenn sicher ist, dass die Standardkultur 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 CA1304
// The code that's violating the rule is on this line.
#pragma warning restore CA1304

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.CA1304.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 und N: 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 für das Beheben von Verstößen

Im folgenden Beispiel verursacht BadMethod zwei Verstöße gegen diese Regel. GoodMethod korrigiert den ersten Verstoß durch Übergeben der invarianten Kultur an String.Compare und korrigiert den zweiten Verstoß durch übergeben der aktuellen Kultur an String.ToLower, da string3 dem Benutzer angezeigt wird.

public class CultureInfoTest
{
    public void BadMethod(String string1, String string2, String string3)
    {
        if (string.Compare(string1, string2, false) == 0)
        {
            Console.WriteLine(string3.ToLower());
        }
    }

    public void GoodMethod(String string1, String string2, String string3)
    {
        if (string.Compare(string1, string2, false,
                          CultureInfo.InvariantCulture) == 0)
        {
            Console.WriteLine(string3.ToLower(CultureInfo.CurrentCulture));
        }
    }
}

Beispiel für formatierte Ausgabe

Das folgende Beispiel zeigt die Auswirkung der aktuellen Kultur auf den Standardwert IFormatProvider, der vom DateTime-Typ ausgewählt wird.

public class IFormatProviderTest
{
    public static void Main1304()
    {
        string dt = "6/4/1900 12:15:12";

        // The default behavior of DateTime.Parse is to use
        // the current culture.

        // Violates rule: SpecifyIFormatProvider.
        DateTime myDateTime = DateTime.Parse(dt);
        Console.WriteLine(myDateTime);

        // Change the current culture to the French culture,
        // and parsing the same string yields a different value.

        Thread.CurrentThread.CurrentCulture = new CultureInfo("Fr-fr", true);
        myDateTime = DateTime.Parse(dt);

        Console.WriteLine(myDateTime);
    }
}

Dieses Beispiel erzeugt die folgende Ausgabe:

6/4/1900 12:15:12 PM
06/04/1900 12:15:12

Siehe auch