Udostępnij za pośrednictwem


CA1304: Określ CultureInfo

Właściwości Wartość
Identyfikator reguły CA1304
Tytuł Określ CultureInfo
Kategoria Globalizacja
Poprawka jest powodująca problemy lub niepowodująca problemów Niezgodność
Domyślnie włączone na platformie .NET 10 Nie.
Zastosowane języki C# i Visual Basic

Przyczyna

Metoda lub konstruktor wywołuje członka, który ma przeciążenie przyjmujące parametr System.Globalization.CultureInfo, ale nie wywołuje przeciążenia przyjmującego parametr CultureInfo. Ta reguła ignoruje wywołania następujących metod:

Można również skonfigurować więcej symboli, które mają być wykluczone przez tę regułę.

Opis reguły

Jeśli obiekt CultureInfo lub System.IFormatProvider nie zostanie podany, wartość domyślna dostarczana przez przeciążony element członkowski może nie mieć oczekiwanego efektu we wszystkich ustawieniach regionalnych. Ponadto członkowie platformy .NET wybierają domyślną kulturę i formatowanie na podstawie założeń, które mogą nie być poprawne dla kodu. Aby upewnić się, że kod działa zgodnie z oczekiwaniami w scenariuszach, należy podać informacje specyficzne dla kultury zgodnie z następującymi wytycznymi:

  • Jeśli wartość zostanie wyświetlona użytkownikowi, użyj bieżącej kultury. Zobacz: CultureInfo.CurrentCulture.

  • Jeśli wartość będzie przechowywana i uzyskiwana przez oprogramowanie, czyli utrwalone w pliku lub bazie danych, użyj niezmiennej kultury. Zobacz: CultureInfo.InvariantCulture.

  • Jeśli nie znasz miejsca docelowego wartości, określ kulturę odbiorcy danych lub dostawcy danych.

Nawet jeśli domyślne zachowanie przeciążonej funkcji jest odpowiednie dla Twoich potrzeb, lepiej jest jawnie wywołać przeciążenie specyficzne dla kultury, aby kod był bardziej zrozumiały i łatwiejszy do konserwacji.

Uwaga

CultureInfo.CurrentUICulture służy wyłącznie do pobierania zlokalizowanych zasobów przy użyciu instancji klasy System.Resources.ResourceManager.

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, użyj wersji przeciążenia, która przyjmuje CultureInfo jako argument.

Kiedy pomijać ostrzeżenia

Można bezpiecznie pominąć ostrzeżenie z tej reguły, gdy jest pewna, że domyślna kultura jest prawidłowym wyborem, a utrzymanie kodu nie jest ważnym priorytetem programowania.

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

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

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

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

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.

Konfigurowanie kodu do analizowania

Użyj poniższych opcji, aby skonfigurować, które części bazy kodów powinny być objęte tą regułą.

Możesz skonfigurować te opcje tylko dla tej reguły, dla wszystkich reguł, do których mają zastosowanie, lub dla wszystkich reguł w tej kategorii (globalizacji), do których mają zastosowanie. Aby uzyskać więcej informacji, zobacz Opcje konfiguracji reguły jakości kodu.

Wyklucz określone symbole

Z analizy można wykluczyć określone symbole, takie jak typy i metody, ustawiając opcję excluded_symbol_names. Aby na przykład określić, że reguła nie powinna być uruchamiana w żadnym kodzie w typach o nazwie MyType, dodaj następującą parę klucz-wartość do pliku editorconfig w projekcie:

dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType

Uwaga

Zastąp część XXXXCAXXXX identyfikatorem odpowiedniej reguły.

Dozwolone formaty nazw symboli w wartości opcji (oddzielone przez |):

  • Tylko nazwa symbolu (zawiera wszystkie symbole o nazwie, niezależnie od typu zawierającego lub przestrzeni nazw).
  • W pełni kwalifikowane nazwy w formacie identyfikatora dokumentacji symbolu. Każda nazwa symbolu wymaga prefiksu określającego rodzaj symbolu, takiego jak M: dla metod, T: dla typów i N: dla przestrzeni nazw.
  • .ctor dla konstruktorów i .cctor dla konstruktorów statycznych.

Przykłady:

Wartość opcji Podsumowanie
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType Pasuje do wszystkich symboli o nazwie MyType.
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 Pasuje do wszystkich symboli o nazwie MyType1 lub MyType2.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) Dopasowuje określoną metodę MyMethod do zadanego w pełni kwalifikowanego podpisu.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) Dopasowuje określone metody MyMethod1 i MyMethod2 do ich odpowiednich w pełni kwalifikowanych sygnatur.

Wyklucz określone typy i ich typy pochodne

Określone typy i ich typy pochodne można wykluczyć z analizy, ustawiając opcję excluded_type_names_with_derived_types. Aby na przykład określić, że reguła nie powinna być uruchamiana na żadnych metodach w typach nazwanych MyType i ich typach pochodnych, dodaj następującą parę klucz-wartość do pliku .editorconfig w projekcie:

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType

Uwaga

Zastąp część XXXXCAXXXX identyfikatorem odpowiedniej reguły.

Dozwolone formaty nazw symboli w wartości opcji (oddzielone przez |):

  • Wpisz tylko nazwę typu (obejmuje wszystkie typy o tej nazwie, niezależnie od typu zawierającego lub przestrzeni nazw).
  • W pełni kwalifikowane nazwy w formacie ID dokumentacji symbolu, z opcjonalnym T: prefiksem.

Przykłady:

Wartość opcji Podsumowanie
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType Pasuje do wszystkich typów nazwanych MyType i wszystkich ich typów pochodnych.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 Dopasuje wszystkie typy o nazwie MyType1 lub MyType2 i wszystkie ich typy pochodne.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType Pasuje do określonego typu MyType z podaną pełną kwalifikowaną nazwą i wszystkimi jego typami pochodnymi.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 Dopasowuje określone typy MyType1 i MyType2 z odpowiednimi w pełni kwalifikowanymi nazwami oraz wszystkie ich typy pochodne.

Przykład pokazujący sposób naprawiania naruszeń

W poniższym przykładzie BadMethod powoduje dwa naruszenia tej reguły. GoodMethod poprawia pierwsze naruszenie, przekazując niezmienną kulturę do String.Compare, i koryguje drugie naruszenie, przekazując bieżącą kulturę do String.ToLower, ponieważ string3 jest wyświetlane użytkownikowi.

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

Przykład przedstawiający sformatowane dane wyjściowe

W poniższym przykładzie pokazano wpływ bieżącej kultury na wartość domyślną IFormatProvider, która jest wybierana przez typ DateTime.

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

Ten przykład generuje następujące wyniki:

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

Zobacz też