Использование Int32.ToString () без Format и IFormatProvider. Почему я получаю предупреждение CA1305? - PullRequest
6 голосов
/ 04 апреля 2011

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

CA1305: Microsoft. Глобализация: потому что поведение int.ToString () может варьируется в зависимости от текущего пользователя Настройки языка, замените этот вызов в Class.Method () с вызовом 'Int.toString (IFormatProvider). Если результат 'int.ToString ( IFormatProvider) 'будет отображаться для пользователь, укажите «CultureInfo.CurrentCulture» как Параметр «IFormatProvider». В противном случае, если результат будет хранятся и доступны с помощью программного обеспечения, таких как как, когда он сохраняется на диск или базу данных, укажите 'CultureInfo.InvariantCulture'.

Это очень известное общее предупреждение CA1305, которое отображается при каждом вызове метода с перегрузкой, который принимает параметр IFormatProvider. Хотя это очень справедливое предупреждение почти во всех случаях, я не могу вспомнить ничего, что могло бы пойти не так при вызове значения по умолчанию ToString() без какого-либо формата или formatprovider для целого числа. Поэтому, пожалуйста, если кто-нибудь знает что-нибудь, что может пойти не так, просветите меня. Я предполагаю, что должна быть веская причина для перегрузки IFormatProvider.

Кстати, я делаю всегда звоню, используя перегрузку IFormatProvider, потому что это, похоже, также дает выигрыш в производительности. Если у кого-либо есть проницательные комментарии по этому поводу, не стесняйтесь поделиться ими.

Ответы [ 4 ]

9 голосов
/ 04 апреля 2011

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

  • Подставлены ли цифры (не уверен, влияет ли это на 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
3 голосов
/ 04 апреля 2011

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

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

3 голосов
/ 04 апреля 2011

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

0 голосов
/ 16 сентября 2016

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

  • подставляются ли цифры (не уверен, влияет ли это на 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());
        }
      }
    
...