Должен ли я всегда указывать, какой IFormatProvider использовать? - PullRequest
4 голосов
/ 08 августа 2011

Я попытался запустить FxCop на нескольких сборках нашего продукта, и я получаю множество совпадений с правилом "Specify IFormatProvider".

Как это бывает, некоторые из них являются законными, но это такжесоответствует коду:

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

Который может быть записан как

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

Второй вариант гораздо сложнее для чтения.

Итак, действительно рекомендуется всегда указывает IFormatProvider или это «просто» ограничение эвристики, используемой в правиле?

Ответы [ 3 ]

6 голосов
/ 08 августа 2011

Это применимо только к методам с перегрузкой IFormatProvider.

Для решения этой проблемы у меня есть два статических класса, InvariantText и CulturedText, которые работают со строками в инвариантной культуре итекущая культура соответственно.Например, у меня есть метод Format в каждом классе.Таким образом, я могу выполнять культурно-нейтральное и культурно-ориентированное форматирование без необходимости каждый раз указывать IFormatProvider.

Пример:

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

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

InvariantText.Format и CulturedText.Formatпросто обертки к методу String.Format и, соответственно, возвращаемые строки.


Вы можете даже использовать этот шаблон, чтобы обернуть другие функции, которые требуют не зависящих от культуры и специфичных для культуры строк.Например, создайте два метода, InvariantLog и CulturedLog, которые обертывают вызовы к Logger.DebugFormat в вашем вопросе и принимают соответствующие IFormatProvider в каждом случае.

2 голосов
/ 08 августа 2011

Это зависит. Вы знаете, как и где будет использоваться приложение, поэтому рассмотрите следующие рекомендации MSDN :

  1. Если значение будет отображаться пользователю, используйте текущую культуру. См. System.Globalization.CultureInfo.CurrentCulture .
  2. Если значение будет сохранено и доступно программному обеспечению (сохранено в файле или базе данных), используйте инвариантную культуру. См. System.Globalization.CultureInfo.InvariantCulture .
  3. Если вы не знаете место назначения значения, попросите потребителя или поставщика данных указать язык.

PS: Я считаю, что FxCop следует третьему правилу и позволяет вам самим определять правильную культуру.

1 голос
/ 08 августа 2011

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

...