2010-07-12 3 views
19

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

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

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

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

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

хороший материал чтения:

ответ

16

Существует врожденная компромисс в игре здесь.

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

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

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

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

+1

@Reed Copsey: Я также обнаружил, что добавление его везде как рефлекс FxCop создает ошибки - несколько раз я видел экземпляры, в которых была указана неправильная опция культуры. Это, очевидно, просто проблема образования, но это обычное явление, когда что-то вроде FxCop говорит вам делать что-то, но вы не всегда понимаете, почему. –

+2

@Scott: Верно. Но так обстоит дело со всем в программировании - если вы собираетесь его использовать, вам нужно это понять или это вас укусит. Единственный разумный способ сделать локализацию - это рассмотреть ее, когда вы впервые напишите код - локализация завершенного продукта - одна из худших задач, которые нужно сделать, и на порядок дороже, чем думать об этом с самого начала. –

+0

Я не согласен. Я бы поместил культуру во все классы ToString() моих классов? Я думаю, что логика и объекты должны не знать о культуре. – onof

5

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

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