CA1304: укажите CultureInfo
TypeName |
SpecifyCultureInfo |
CheckId |
CA1304 |
Категория |
Microsoft.Globalization |
Критическое изменение |
Не критическое |
Причина
Метод или конструктор вызывает член, имеющий перегрузку, которая принимает параметр CultureInfo, вместо того чтобы вызвать эту самую перегрузку, принимающую параметр CultureInfo.Данное правило пропускает вызовы следующих методов:
Описание правила
Если объект CultureInfo или IFormatProvider не предоставляется, значение по умолчанию, предоставляемое перегруженным членом, может не иметь ожидаемого результата во всех языковых стандартах.Кроме того, члены .NET Framework выбирают язык и региональные параметры, исходя из предположения, что этот выбор может быть неверен для данного кода.Чтобы обеспечить правильную работу кода в предполагаемых ситуациях, необходимо предоставить сведения о языке и региональных параметрах, следуя приведенным ниже рекомендациям.
Если значение отображается для пользователей, используйте текущий язык и региональные параметры.См. раздел CultureInfo.CurrentCulture.
Если значение предназначено для хранения и использования программным обеспечением, то есть сохраняется в файле или базе данных, следует использовать инвариантный язык и региональные параметры.См. раздел CultureInfo.InvariantCulture.
Если назначение значения неизвестно, язык и региональные параметры должны указываться объектом-получателем или поставщиком данных.
Обратите внимание, что значение CultureInfo.CurrentUICulture используется только для извлечения локализованных ресурсов с помощью экземпляра класса ResourceManager.
Возможно, поведение по умолчанию перегруженного члена соответствует потребностям разработчика, однако всегда лучше явно вызвать перегрузку, предоставляющую сведения о языке и региональных параметрах, чтобы получить самодокументируемый и более простой в обслуживании код.
Устранение нарушений
Чтобы устранить нарушение данного правила, используйте перегрузку, которая принимает параметр CultureInfo или IFormatProvider, и укажите аргумент в соответствии с ранее приведенными рекомендациями.
Отключение предупреждений
Отключение предупреждений о нарушении данного правила будет безопасным в том случае, если доподлинно известно, что поставщик языка и региональных параметров, используемый по умолчанию, является правильным выбором, или удобство поддержки не является важным при разработке кода.
Пример
В следующем примере BadMethod приводит к двум нарушениям данного правила.GoodMethod устраняет первое нарушение посредством передачи инвариантного языка и региональных параметров в System.String.Compare, а также устраняет второе нарушение путем передачи текущего языка и региональных параметров в ToLower, поскольку string3 отображается для пользователя.
using System;
using System.Globalization;
namespace GlobalizationLibrary
{
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.
using System;
using System.Globalization;
using System.Threading;
namespace GlobalLibGlobalLibrary
{
public class IFormatProviderTest
{
public static void Main()
{
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);
}
}
}
В результате выполнения примера получается следующий результат:
Связанные правила
CA1305: укажите IFormatProvider