Какова лучшая практика для определения CurrentCulture или InvariantCulture и не определения культуры вообще?
Из того, что я читал, если Вы делаете сериализацию, например, Вам нужен InvariantCulture как средство определения канонического представления значения данных. Это - относительно небольшой процент основанных на культуре обработок строк.
Я нахожу его долго, подробным, и ужасным большую часть времени для определения его каждый раз, когда я делаю, говорю:
var greeting = string.Format(CultureInfo.CurrentCulture, "Hello ", userName);
Однако моя команда недавно включила FxCop и теперь существует нажатие, чтобы всегда использовать CultureInfo ВЕЗДЕ. Что лучшая техника состоит в том, чтобы объединить краткость, удобочитаемость и функциональность?
Некоторый хороший материал чтения:
Здесь есть неизбежный компромисс.
Как минимум, вы захотите указать CultureInfo, чтобы использовать InvariantCulture всякий раз, когда вы делаете что-либо внутри своей программы. Например, использование этого с сериализацией заставляет представление данных всегда быть одинаковым, поэтому вам не нужно беспокоиться о проблемах интернационализации с вашими внутренними форматами данных.
При этом указание этого повсюду имеет некоторые преимущества - в основном с точки зрения принуждения вас убедиться, что вы справляетесь с этим правильно. Работа внутренней программы по сравнению с работой пользовательского интерфейса должна иметь другую культуру (при условии, что вы хотите правильно локализовать свое приложение). В результате сложная программа имеет тенденцию требовать, чтобы это указывалось повсюду, поскольку оставлять значение «по умолчанию» в лучшем случае опасно и со временем приводит к появлению ошибок.
Однако указание этого, как вы заметили, имеет тенденцию к увеличению размера вашего кода и потенциально снижает удобочитаемость. Это приводит к компромиссу - удобочитаемость и ремонтопригодность за счет более короткого кода по сравнению с надлежащей интернационализацией, локализацией и ремонтопригодностью за счет большей ясности повсюду.
На мой взгляд, здесь нет «правильного» ответа - это действительно зависит от вашего приложения. Если ваше приложение полностью посвящено презентации и не выполняет много операций с данными, особенно с каким-либо типом самоуправляемого файлового хранилища, установка текущей культуры (и культуры пользовательского интерфейса) один раз может быть хорошей.Я обнаружил, что более сложные приложения, как правило, не работают таким образом, однако в этом случае предложения FxCop об указании этого повсюду кажутся более привлекательными.
По умолчанию уже используется текущий язык и региональные параметры, инициализированные Windows. Так что явное использование CultureInfo.CurrentCulture - пустая трата времени. Любой достойный формат сериализации (включая двоичную сериализацию и сериализацию XML) будет сериализовать DateTime инвариантным образом для культуры.
Использование культуры, отличной от культуры по умолчанию, очень опасно. Поток всегда будет запускаться с культурой по умолчанию, заданной Windows и настроенной пользователем при установке Windows. .NET постоянно запускает потоки пула потоков, и вы рискуете получить культуру в этом потоке, отличную от вашего основного потока. Что может вызвать множество тонких проблем. Например, если у вас есть SortedList, который внезапно больше не сортируется.