Когда я должен указать CurrentCulture или InvariantCulture и когда я должен оставить его неуказанным? - PullRequest
19 голосов
/ 12 июля 2010

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

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

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

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

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

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

Ответы [ 2 ]

18 голосов
/ 12 июля 2010

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

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

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

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

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

5 голосов
/ 12 июля 2010

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

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

...