Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
| Свойство | Значение |
|---|---|
| Идентификатор правила | CA1304 |
| Заголовок | Задайте CultureInfo |
| Категория | Глобализация |
| Исправление является разрушающим или неразрушающим | Неразрывный |
| Включен по умолчанию в .NET 10 | Нет |
| Применимые языки | C# и Visual Basic |
Причина
Метод или конструктор вызывает элемент, имеющий перегрузку, которая принимает параметр System.Globalization.CultureInfo, и этот метод или конструктор не вызывает перегрузку, которая принимает параметр CultureInfo. Это правило игнорирует вызовы следующих методов:
Вы также можете настроить дополнительные символы для исключения с помощью этого правила.
Описание правила
Если объект CultureInfo или System.IFormatProvider не предоставляется, значение по умолчанию, поставляемое перегруженным членом, может не оказать ожидаемого воздействия во всех языковых стандартах. Кроме того, участники .NET выбирают систему культуры и форматирования по умолчанию, основываясь на предположениях, которые могут быть неверными для вашего конкретного кода. Чтобы в ваших сценариях код функционировал ожидаемым образом, необходимо предоставлять сведения, относящиеся к культуральным особенностям, с учетом следующих рекомендаций.
Если значение будет отображаться для пользователя, используйте текущую культуру. См. CultureInfo.CurrentCulture.
Если значение будет сохранено и доступ к нему получено программным обеспечением (сохранено в файл или базу данных), используйте инвариантную культуру. См. CultureInfo.InvariantCulture.
Если вам неизвестно назначение значения, язык и региональные параметры должен указать либо потребитель, либо поставщик данных.
Даже если установленное по умолчанию поведение перегруженного элемента соответствует вашим потребностям, рекомендуется явным образом вызывать перегрузку, зависящую от языка и региональных параметров, чтобы сделать код самодокументируемым и упростить его обслуживание.
Примечание.
CultureInfo.CurrentUICulture используется только для получения локализованных ресурсов с помощью экземпляра класса System.Resources.ResourceManager.
Устранение нарушений
Чтобы исправить нарушение этого правила, используйте перегрузку, принимающую аргумент CultureInfo.
Когда лучше отключить предупреждения
Предупреждения для этого правила можно отключить, когда точно установлено, что используемые параметры языка и региона по умолчанию являются правильными, и поддержка кода не имеет приоритета в процессе разработки.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA1304
// The code that's violating the rule is on this line.
#pragma warning restore CA1304
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA1304.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Настройка кода для анализа
Используйте следующие параметры, чтобы указать части базы кода, к которым будет применяться это правило.
Эти параметры можно настроить только для этого правила, для всех правил, к которым они применяются, или для всех правил в этой категории (глобализации), к которым они применяются. Дополнительные сведения см. в статье Параметры конфигурации правила качества кода.
Исключение определенных символов
Вы можете исключить определенные символы, такие как типы и методы, из анализа, задав параметр excluded_symbol_names. Например, чтобы указать, что правило не должно выполняться для какого-либо кода в типах с именем MyType, добавьте следующую пару "ключ-значение" в файл EDITORCONFIG в своем проекте:
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Примечание.
Замените XXXX частью CAXXXX идентификатором применимого правила.
Допустимые форматы имени символа в значении параметра (разделенные |):
- Только имя символа (включает все символы с данным именем, вне зависимости от типа и пространства имен).
- Полные имена в формате идентификатора документации для символа. Для каждого имени символа требуется префикс в виде символа, например
M:для методов,T:для типов иN:для пространств имен. -
.ctorиспользуется для конструкторов, а.cctor— для статических конструкторов.
Примеры:
| Значение опции | Итоги |
|---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
Соответствует всем символам с именем MyType. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
Соответствует всем символам с именем MyType1 или MyType2. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
Определяет соответствие конкретного метода MyMethod с заданной полной сигнатурой. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Сопоставляет конкретные методы MyMethod1 и MyMethod2 с соответствующими полными квалифицированными сигнатурами. |
Исключить определенные типы и их производные типы
Вы можете исключить определенные типы и производные типы из анализа, задав параметр excluded_type_names_with_derived_types. Например, чтобы указать, что правило не должно выполняться в каких-либо методах типов MyType и их производных типов, добавьте следующую пару "ключ-значение" в файл .editorconfig своего проекта:
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Примечание.
Замените XXXX частью CAXXXX идентификатором применимого правила.
Допустимые форматы имени символа в значении параметра (разделенные |):
- Только имя типа (включает все типы с этим именем, независимо от содержащего типа или пространства имен).
- полные имена символов в формате идентификатора документации с необязательным префиксом
T:.
Примеры:
| Значение параметра выбора | Итоги |
|---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
Соответствует всем типам с именем MyType и всем их производным типам. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
Соответствует всем типам с именем MyType1 или MyType2 и всем их производным типам. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Соответствует конкретному типу MyType с заданным полным именем и всем производным от него типам. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Соответствует конкретным типам MyType1 и MyType2 с их соответствующими полными именами и всеми производными от них типами. |
Пример, демонстрирующий устранение нарушений
В следующем примере BadMethod вызывает два нарушения этого правила.
GoodMethod устраняет первое нарушение, передавая инвариантные язык и региональные параметры в String.Compare, и исправляет второе нарушение, передавая текущие язык и региональные параметры в String.ToLower, так как string3 отображается для пользователя.
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));
}
}
}
Пример, демонстрирующий форматированный вывод
В следующем примере показано влияние текущей культуры на IFormatProvider по умолчанию, который выбирается типом 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);
}
}
В примере получается следующий вывод.
6/4/1900 12:15:12 PM
06/04/1900 12:15:12