Используя Значения Int32.ToString () без формата и IFormatProvider. Почему я получаю предупреждение CA1305?

я задавался вопросом об этом в течение довольно долгого времени, но я не могу найти окончательного ответа. Всякий раз, когда я преобразовать целое число в строку, используя ToString() метод, и я запускаю анализ кода, я получаю следующее предупреждение:

CA1305: Microsoft.Глобализация: потому что поведение ' int.ToString () ' может зависит от текущего пользователя настройки локали, замените этот вызов - Класс.Способ () с вызовом int.Метод ToString(Объекта Iformatprovider)'. Если результат ' int.Метод toString( IFormatProvider) ' будет отображаться для пользователь, укажите 'Свойство CultureInfo.CurrentCulture ' как Параметр' IFormatProvider'. В противном случае, если результат будет хранятся и доступны с помощью программного обеспечения, например а когда он сохраняется на диск или база данных, укажите 'Свойство CultureInfo.Инвариантная культура".

Это очень известное универсальное предупреждение CA1305, которое отображается при каждом вызове метода с перегрузкой, которая принимает

4 ответов


есть вещи, которые я бы представьте себе, может легко повлиять на результат:

  • заменяются ли цифры (не уверен, влияет ли это на ToString)
  • сгруппированы ли цифры (не уверен, что NumberFormatInfo будет когда-нибудь групповые цифры в целочисленном виде только из такого рода вызова ToString)
  • отрицательный знак (это может легко быть значительным)

короткий, но полный пример, как это может повлиять на вещи, используя NegativeSign свойства:

using System;
using System.Globalization;
using System.Threading;

class Test
{
    static void Main()
    {
        int x = -10;
        Console.WriteLine(x.ToString());

        CultureInfo culture = Thread.CurrentThread.CurrentCulture;
        // Make a writable clone
        culture = (CultureInfo) culture.Clone();
        culture.NumberFormat.NegativeSign = "!!!";

        Thread.CurrentThread.CurrentCulture = culture;
        Console.WriteLine(x.ToString());
    }
}

выход:

-10
!!!10

Если вы посмотрите на Класс NumberFormatInfo, вы увидите, что некоторые свойства применяются к целым числам, например PositiveSign или групповые разделители, например.


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

вызов без параметров в ToString в свою очередь, принять вызов ToString(CultureInfo.CurrentCulture). Этот вызов без параметров скрывает эту информацию, поэтому вы должны сделать вызов, где вы показываете, какую информацию о культуре вы хотите использовать в вызове.


есть вещи, которые, как я полагаю, могут легко повлиять на результат:

  • заменяются ли цифры (не уверен, влияет ли это на ToString)

  • сгруппированы ли цифры (не уверен, будет ли NumberFormatInfo когда-либо
    группируйте цифры в целое число только из такого рода вызова ToString)

  • отрицательный знак (это может легко быть значительным)

       using System;
       using System.Globalization;
       using System.Threading;
    
        class Test
       {
         static void Main()
         {
           int x = -10;
             Console.WriteLine(x.ToString());
    
            CultureInfo culture = Thread.CurrentThread.CurrentCulture;
         // Make a writable clone
          culture = (CultureInfo) culture.Clone();
        culture.NumberFormat.NegativeSign = "!!!";
    
         Thread.CurrentThread.CurrentCulture = culture;
        Console.WriteLine(x.ToString());
        }
      }