Подтвердить что ты не робот

Когда следует указывать CurrentCulture или InvariantCulture, и когда я должен оставить его неопределенным?

Какова наилучшая практика для указания CurrentCulture или InvariantCulture и вообще не указывать культуру?

Из того, что я прочитал, например, если вы выполняете сериализацию, вам нужно InvariantCulture как средство указания канонического представления значения данных. Это относительно небольшой процент манипуляций на основе культуры.

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

var greeting = string.Format(CultureInfo.CurrentCulture, "Hello ", userName); 

Однако моя команда недавно включила FxCop, и теперь есть толчок, чтобы всегда использовать CultureInfo в любое время. Каков наилучший способ сочетания краткости, удобочитаемости и функциональности?

Некоторые хорошие материалы для чтения:

4b9b3361

Ответ 1

В игре есть неотъемлемый компромисс.

Как минимум, вы хотите указать CultureInfo для использования InvariantCulture всякий раз, когда вы делаете что-либо внутри своей программы. Например, использование этого параметра с помощью Serialization заставляет представление данных всегда быть одинаковым, поэтому вам не нужно беспокоиться о проблемах интернационализации с вашими внутренними форматами данных.

Говоря об этом, определение этого везде имеет некоторые преимущества - в основном, с точки зрения принуждения к тому, чтобы вы правильно справлялись с этим. Внутренняя работа программы и работа с пользовательским интерфейсом должны иметь определенную культуру (если вы хотите правильно локализовать свое приложение). В результате сложная программа имеет тенденцию требовать, чтобы это было указано повсюду, так как оставить "по умолчанию" опасным в лучшем случае и, как правило, вводить ошибки со временем.

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

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

Ответ 2

По умолчанию это уже текущая культура, инициализированная Windows. Поэтому использование CultureInfo.CurrentCulture явно просто пустая трата времени. Любой достойный формат сериализации (включая двоичную сериализацию и сериализацию XML) будет сериализовать DateTime в инвариантном для культуры способе.

Использование культуры, которая не является по умолчанию, очень опасна. Поток всегда будет запускаться с культурой по умолчанию, как указано в Windows, и настроен пользователем при установке Windows..NET запускает потоки threadpool все время, и вы рискуете получить культуру в этом потоке, отличном от основного потока. Это может вызвать всевозможные тонкие проблемы. Подобно тому, как SortedList неожиданно больше не сортируется.