Что такое инвариантная культура?

173

Кто-нибудь может привести пример, демонстрирующий использование инвариантной культуры ? Я не понимаю, что описывает документация.

Рики
источник
14
Это английский, но не связан ни с одним местоположением.

Ответы:

132

Инвариантная культура - это особая культура, которая полезна, потому что она не изменится. Текущая культура может меняться от одного пользователя к другому или даже от одного запуска к другому, поэтому вы не можете полагаться на то, что он останется прежним.

Возможность использовать одну и ту же культуру каждый раз очень важна для нескольких потоков, например, для сериализации: вы можете иметь значение 1,1 в одной культуре и 1,1 в другой. Если вы попытаетесь разобрать значение «1,1» во второй культуре, то синтаксический анализ завершится неудачно. Однако вы можете использовать инвариантную культуру для преобразования числа в строку и последующего анализа его с любого компьютера с любым набором культур.

// Use some non-invariant culture.
CultureInfo nonInvariantCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentCulture = nonInvariantCulture;

decimal dec = 1.1m;
string convertedToString = dec.ToString();

// Simulate another culture being used,
// following code can run on another computer.
nonInvariantCulture.NumberFormat.NumberDecimalSeparator = ",";

decimal parsedDec;

try
{
    // This fails because value cannot be parsed.
    parsedDec = decimal.Parse(convertedToString);
}
catch (FormatException)
{
}

// However you always can use Invariant culture:
convertedToString = dec.ToString(CultureInfo.InvariantCulture);

// This will always work because you serialized with the same culture.
parsedDec = decimal.Parse(convertedToString, CultureInfo.InvariantCulture);
Андрей Беззуб
источник
9
Для чего это стоит, это в System.Globalizationпространстве имен.
Джим Х.
1
Это всегда будет работать, потому что вы сериализованы с той же культурой << это не имеет смысла для меня, я думаю, что-то неправильно понял. Если использование CultureInfo.InvariantCultureработает, потому что вы сериализовали с той же культурой .... тогда разве это не то же самое, что использование CultureInfo.CurrentCulture?
Alisson
3
@Alisson Если вы вернете последние два кода Эндрю обратно в исходный поток, я думаю, что это будет иметь больше смысла. Если вы всегда сериализуете с использованием, CultureInfo.InvariantCultureто вы знаете, что вы всегда сможете разобрать обратно в десятичную с использованием CultureInfo.InvariantCulture. Если вы используете CultureInfo.CurrentCultureдля сериализации, ваш пользователь может иметь «en-US» в качестве своей текущей культуры. У следующего пользователя, который переходит к анализу до десятичного числа, может существовать текущая культура, которая использует «,» для разделителя.
Дэвид Шпехт
1
@ Андрей Возможно, я глупый, но я не мог понять, что ты говорил, без комментария Дэвида. Я отредактировал ваш ответ, чтобы быть явным.
jpaugh
111

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

По сути, это особая культура, которая является искусственной и не изменится .

TomTom
источник
4
В частности, вы не будете замечены различными способами использования запятых и точек в строковых формах чисел или нечетными преобразованиями.
Стив Гилхэм
8
Да ... типичная проблема для: * американских программистов, которые думают, что это слово на английском языке;) А потом немецкие клиенты пишут 1.000,00 за 1000;) * Даже на одном языке Швейцария и Германия, например, используют "." и "," по-разному в цифрах. Результат -> Конфиг файлы являются мусором. Используйте инвариантный язык там;)
TomTom
23
Чтобы добавить к комментарию Стива: это культура, которую нужно использовать, когда вам на самом деле все равно, как все выглядит (вас не волнует, использует ли она запятые или точки или что-то еще, потому что пользователь никогда не увидит это), но вам это нужно всегда быть таким же (например, потому что вам нужно уметь читать то, что вы написали).
Itowlson
7

Он используется для вещей, которые одинаковы, независимо от культуры (это не нужно переводить в какую-то культуру X, чтобы соответствовать)

как для примера - https://msdn.microsoft.com/en-us/library/4c5zdc6a(v=vs.100).aspx . Когда вы записываете файл приложения, с которым пользователь не должен связываться, вы должны использовать InvariantCulture для всех методов, которые принимают параметр культуры.

Обратите внимание, что согласно документам, указанным выше:

Однако приложение должно использовать инвариантную культуру только для процессов, которые требуют независимых от культуры результатов, таких как форматирование и анализ данных, которые сохраняются в файле.

Gishu
источник
3
Это говорит о том, что инвариантная культура предназначена только для промежуточного формата, то есть, если вы отображаете материал для пользователя, который является результатом инвариантной культуры (то есть «в» инвариантной культуре), вы делаете что-то не так и не понимаю инвариантную культуру.
mlhDev
3

Инвариантная культура нечувствительна к культуре; это связано с английским языком, но не с какой-либо страной / регионом.

CultureInfo.InvariantCulture извлекает экземпляр инвариантной культуры. Его можно использовать практически в любом методе пространства имен System.Globalization, для которого требуется культура.

Объекты, возвращаемые свойствами, такими как CompareInfo, DateTimeFormat и NumberFormat, также отражают правила сравнения строк и форматирования инвариантной культуры. Свойство InvariantCulture пригодится, когда вы хотите отобразить постоянные данные в независимом от культуры формате.

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

CharithJ
источник
0

Это универсальный простой не регионально-специфический английский язык и другая связанная информация. Это как язык самого языка программирования. Вы можете положиться на него при настройке универсального календаря; в ситуации, когда вам нужно генерировать имена контроллеров, URL, имена делегатов ... и т. д. и нужны вещи, чтобы действовать естественно и универсально среди всех пользователей.

Шади Намроути
источник