Укажите CultureInfo
Обновлен: Ноябрь 2007
TypeName |
SpecifyCultureInfo |
CheckId |
CA1304 |
Категория |
Microsoft.Globalization |
Критическое изменение |
Не критическое |
Причина
Метод или конструктор вызывает член, имеющий перегрузку, которая принимает параметр System.Globalization.CultureInfo, вместо того чтобы вызвать эту самую перегрузку, принимающую параметр CultureInfo. Данное правило пропускает вызовы следующих методов:
Описание правила
Если объект CultureInfo или System.IFormatProvider не предоставляется, значение по умолчанию, поставляемое перегруженным членом, может не иметь ожидаемого результата во всех языковых стандартах. Кроме того, члены .NET Framework выбирают язык и региональные параметры, исходя из предположения, что этот выбор может быть неверен для данного кода. Чтобы обеспечить правильную работу кода в предполагаемых ситуациях, необходимо предоставить сведения о языке и региональных параметрах, следуя приведенным ниже рекомендациям.
Если значение отображается для пользователей, используйте текущий язык и региональные параметры. См. раздел CultureInfo.CurrentCulture.
Если значение предназначено для хранения и использования программным обеспечением, то есть сохраняется в файле или базе данных, следует использовать инвариантный язык и региональные параметры. См. раздел CultureInfo.InvariantCulture.
Если назначение значения неизвестно, язык и региональные параметры должны указываться объектом-получателем или поставщиком данных.
Обратите внимание, что значение CultureInfo.CurrentUICulture используется только для извлечения локализованных ресурсов с помощью экземпляра класса System.Resources.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);
}
}
}
При выполнении этого примера выводится следующий результат:
6/4/1900 12:15:12 PM
06/04/1900 12:15:12