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

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

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

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

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

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

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

19
задан Marek Grzenkowicz 9 December 2011 в 14:35
поделиться

2 ответа

Здесь есть неизбежный компромисс.

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

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

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

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

18
ответ дан 30 November 2019 в 04:36
поделиться

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

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

5
ответ дан 30 November 2019 в 04:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: