CA1304: Określ CultureInfo
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA1304 |
Tytuł | Określ argument CultureInfo |
Kategoria | Globalizacja |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 9 | Nie. |
Przyczyna
Metoda lub konstruktor wywołuje element członkowski, który ma przeciążenie, które akceptuje System.Globalization.CultureInfo parametr, a metoda lub konstruktor nie wywołuje przeciążenia, które przyjmuje CultureInfo parametr. 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ć efektu, który ma zostać zastosowany 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ążonego elementu członkowskiego jest odpowiednie dla Twoich potrzeb, lepiej jest jawnie wywołać przeciążenie specyficzne dla kultury, aby kod był dokumentowany samodzielnie i łatwiej konserwowany.
Uwaga
CultureInfo.CurrentUICulture służy tylko do pobierania zlokalizowanych zasobów przy użyciu wystąpienia System.Resources.ResourceManager klasy .
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, użyj przeciążenia, które przyjmuje CultureInfo 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 kodu mają być uruchamiane w tej regule.
Możesz skonfigurować te opcje tylko dla tej reguły, dla wszystkich reguł, których dotyczy, lub dla wszystkich reguł w tej kategorii (globalizacja), których dotyczy. Aby uzyskać więcej informacji, zobacz Opcje konfiguracji reguły jakości kodu.
Wykluczanie określonych symboli
Z analizy można wykluczyć określone symbole, takie jak typy i metody. 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
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 symboli wymaga prefiksu typu symboli, takiego jak
M:
metody,T:
dla typów iN:
przestrzeni nazw. .ctor
dla konstruktorów i.cctor
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) |
Pasuje do określonej metody MyMethod z określonym w pełni kwalifikowanym podpisem. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Pasuje do określonych metod MyMethod1 i MyMethod2 z odpowiednimi w pełni kwalifikowanymi podpisami. |
Wykluczanie określonych typów i ich typów pochodnych
Z analizy można wykluczyć określone typy i ich typy pochodne. 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
Dozwolone formaty nazw symboli w wartości opcji (oddzielone przez |
):
- Nazwa typu (zawiera tylko wszystkie typy o nazwie, niezależnie od typu zawierającego lub przestrzeni nazw).
- W pełni kwalifikowane nazwy w formacie identyfikatora 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 daną w pełni kwalifikowaną nazwą i wszystkimi jego typami pochodnymi. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Pasuje do określonych typów MyType1 i MyType2 z odpowiednimi w pełni kwalifikowanymi nazwami i wszystkimi ich typami pochodnymi. |
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.Compareelementu i koryguje drugie naruszenie, przekazując bieżącą kulturę do String.ToLower elementu , ponieważ string3
jest wyświetlana 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 wybraną DateTime przez typ.
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