2011-04-04 249 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()); 
        } 
        } 
    
相關問題