2011-08-08 24 views
4

我試着在我們的產品的幾個組件上運行FxCop,並且我得到了很多「指定IFormatProvider」規則的匹配。我應該總是指定使用哪一個IFormatProvider?

碰巧,其中一些是合法的,但它也符合這樣的代碼:

Logger.DebugFormat("Appending file {0}", fileName); 

這可以寫成

Logger.DebugFormat(CultureInfo.InvariantCulture, "Appending file {0}", fileName); 

第二個變量是更難閱讀。

那麼,它實際上是否推薦總是指定IFormatProvider還是「只是」規則中啓發式的限制嗎?

回答

6

它只適用於帶有IFormatProvider過載的方法。

爲了解決這個問題,我有兩個靜態類,InvariantTextCulturedText,它們分別用於不變文化和當前文化中的字符串。例如,我在每個類中都有一個Format方法。這樣,我可以做文化中立和文化感知的格式,而不必每次都指定IFormatProvider

實施例:

InvariantText.Format("0x{0:X8}",value); 

CulturedText.Format("Appending file {0}",file); 

InvariantText.FormatCulturedText.Format是簡單的包裝到String.Format方法,並且因此同樣返回字符串。


你甚至可以使用這種模式來包裝其他功能,需要文化中立和文化特定的字符串。例如,創建兩個方法,InvariantLogCulturedLog,在您的問題中將呼叫打包爲Logger.DebugFormat,並在每種情況下采取適當的IFormatProvider

+1

謝謝,這是一個明確的改進,但它不適用於我的記錄器,因爲界面超出了我的控制範圍......而那些調用最讓我惱火的是:)將此標記爲正確答案,因爲它到目前爲止是最有用的。 –

+0

InvariantText.Format和CulturedText.Format方法返回字符串。在您的示例中,您可以將記錄器方法重寫爲Logger.DebugFormat(CulturedText.Format(「Appending file {0}」,fileName));'。 –

+0

這實際上是一個非常好的主意。 +1。 – Joey

2

這取決於。你知道如何以及在哪裏申請將被使用,所以請考慮以下MSDN建議:

  1. 如果該值將被顯示給用戶,使用當前文化。請參閱System.Globalization.CultureInfo.CurrentCulture
  2. 如果該值將被軟件存儲和訪問(持久化到文件或數據庫),請使用不變文化。見System.Globalization.CultureInfo.InvariantCulture
  3. 如果您不知道值的目的地,請讓數據使用者或提供者指定文化。

PS:我相信FxCop遵循第三條規則,讓你自己指定正確的文化。

1

該規則不是您的代碼的唯一讀者。如果您沒有明確指定格式化文化,維護開發人員將無法區分故意回退到默認格式文化(大多數情況下爲CurrentCulture)或可能導致格式錯誤的遺漏。如果你不喜歡冗長的話,可以考慮使用Peter O提出的包裝方法。

+0

謝謝,關於未來維護的觀點非常好。 –