2011-04-04 247 views
6

我一直在想这件事很长一段时间,但我似乎无法找到明确的答案。每当我转换为整数使用ToString()方法的字符串,我运行代码分析,我得到以下警告:使用Int32.ToString()没有格式和IFormatProvider。为什么我会收到CA1305警告?

CA1305:Microsoft.Globalization:因为“)int.ToString(下称” 行为可能 会根据当前用户的 区域设置设置而异,请将'Class.Method()'中的此调用替换为调用 'int.ToString(IFormatProvider)'。 如果'int.ToString( IFormatProvider)'的结果将显示为 该用户,则指定 'CultureInfo.CurrentCulture'作为 'IFormatProvider'参数。 否则,如果结果将是 存储和软件访问,如 ,当它被持久化到磁盘或 数据库,指定 'CultureInfo.InvariantCulture'。

这是非常著名的通用CA1305警告,每当你做出有一个接受IFormatProvider参数的重载方法的调用它获取所示。虽然这在几乎所有情况下都是非常正确的警告,但我无法想象任何在调用默认值ToString()时没有任何格式或格式提供者的整数。所以,如果有人知道任何可能出错的东西,请赐教。我猜测IFormatProvider过载肯定是有原因的。

顺便说一下,我总是使用IFormatProvider超载拨打电话,因为它似乎也有一个性能的好处。如果有人对此有任何有见地的评论,请随时分享。

回答

9

有些事情我会想象很容易影响结果:

  • 无论数字被取代(不知道这是否会影响的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 
+0

很明显的例子,谢谢。我不知道每种文化都有不同的负面迹象。 – 2011-04-04 08:49:18

3

如果你看一看的NumberFormatInfo Class,你会看到一些属性适用于整数,例如PositiveSign或Group Separators。

3

即使文化之间的格式实际上没有差异,也会发出警告,因为您实际上是在使用文化信息进行调用,而文化信息看起来不包含任何文化信息。警告并不太在意文化信息是否有所不同,而是代码隐藏了文化信息被使用的信息。

无参数调用ToString将转而拨打ToString(CultureInfo.CurrentCulture)。无参数呼叫隐藏了这些信息,因此您应该在呼叫中显示您希望在呼叫中使用的文化信息。

+0

我同意你关于隐藏的观点,尽管我仍然认为警告是关于文化差异的:'因为'int.ToString()'的行为可能会根据当前用户的区域设置而有所不同:' – 2011-04-04 08:46:10

+1

@Rewinder:The事实上,由于设置的结果不同,这不是问题,如果指定'CultureInfo.CurrentCulture',它仍会这样做,这就是隐藏文化用法,这是问题。 – Guffa 2011-04-04 10:40:43

0

有事情,我会想象很容易影响结果:

  • 无论数字被取代(不知道这是否会影响的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()); 
        } 
        } 
    
相关问题