Поделиться через


CA1305: укажите IFormatProvider

TypeName

SpecifyIFormatProvider

CheckId

CA1305

Категория

Microsoft.Globalization

Критическое изменение

Не критическое

Причина

Метод или конструктор вызывает один или несколько членов, имеющих перегрузки, которые принимают параметр IFormatProvider, вместо того чтобы вызвать перегрузку, принимающую параметр IFormatProvider.Данное правило не распространяется на вызовы методов .NET Framework, которые в документации указаны как пропускающие параметр IFormatProvider, а также на следующие методы:

Описание правила

Если объект CultureInfo или IFormatProvider не предоставляется, значение по умолчанию, предоставляемое перегруженным членом, может не иметь ожидаемого результата во всех языковых стандартах.Кроме того, члены .NET Framework выбирают язык и региональные параметры, исходя из предположения, что этот выбор может быть неверен для данного кода.Чтобы обеспечить правильную работу кода в сценариях, необходимо предоставить сведения о языке и региональных параметрах согласно приведенным ниже рекомендациям:

  • Если значение отображается для пользователей, используйте текущий язык и региональные параметры.См. раздел CultureInfo.CurrentCulture.

  • Если значение предназначено для хранения и использования программным обеспечением (сохраняется в файле или базе данных), следует использовать инвариантный язык и региональные параметры.См. раздел CultureInfo.InvariantCulture.

  • Если назначение значения неизвестно, язык и региональные параметры должны указываться объектом-получателем или поставщиком данных.

Обратите внимание, что значение CultureInfo.CurrentUICulture используется только для извлечения локализованных ресурсов с помощью экземпляра класса ResourceManager.

Возможно, поведение по умолчанию перегруженного члена соответствует потребностям разработчика, однако всегда лучше явно вызвать перегрузку, предоставляющую сведения о языке и региональных параметрах, чтобы получить самодокументируемый и более простой в обслуживании код.

Устранение нарушений

Чтобы устранить нарушение данного правила, используйте перегрузку, которая принимает параметр CultureInfo или IFormatProvider, и укажите аргумент в соответствии с ранее приведенными рекомендациями.

Отключение предупреждений

Отключение предупреждений о нарушении данного правила будет безопасным в том случае, если доподлинно известно, что поставщик языка и региональных параметров, используемый по умолчанию, является правильным выбором, или удобство поддержки не является важным при разработке кода.

Пример

В следующем примере BadMethod приводит к двум нарушениям данного правила.GoodMethod устраняет первое нарушение посредством передачи инвариантного языка и региональных параметров в 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);
        }
    }
}

В результате выполнения примера получается следующий результат:

  

Связанные правила

CA1304: укажите CultureInfo

См. также

Другие ресурсы

Использование класса CultureInfo