簡體   English   中英

我應該總是指定使用哪個IFormatProvider嗎?

[英]Should I always specify which IFormatProvider to use?

我嘗試在我們的產品的幾個程序集上運行FxCop,並且我獲得了許多匹配“Specify IFormatProvider”規則。

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

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

哪個可以寫成

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

第二種變體更難閱讀。

那么,它是否真的建議始終指定IFormatProvider還是“只是”規則中使用的啟發式的限制?

它僅適用於具有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在每種情況下。

這取決於。 您知道應用程序的使用方式和位置,因此請考慮遵循MSDN建議:

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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM