Що таке інваріантна культура?


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?
Еліссон

3
@Alisson Якщо ви повернете останні два заяви Ендрю в початковий потік, я думаю, це матиме більше сенсу. Якщо ви завжди серіалізуєте, використовуючи, CultureInfo.InvariantCultureто ви знаєте, що ви завжди зможете розібратися до десяткової, використовуючи CultureInfo.InvariantCulture. Якщо ви використовуєте CultureInfo.CurrentCultureсеріалізацію, у вашого користувача може бути "en-US" як їх поточна культура. Наступний користувач, який поверне його до десяткового числа, може мати поточну культуру, яка використовує "," для роздільника.
Девід Спехт

1
@Andrew Можливо, я щільний, але я не міг зрозуміти, що ти говорив, без коментаря Девіда. Я відредагував вашу відповідь явною.
jpaugh

111

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

В основному це специфічна культура, яка є штучною і не зміниться .


4
Зокрема, вас не зачеплять різні способи використання коми і точок у рядкових формах чисел або непарних перетворень.
Стів Гілхам

8
Так ... типова проблема для: * Американських програмістів, які думають, що це слово англійською мовою;) І тоді німецькі замовники пишуть 1.000,00 за 1000;) Так. * Навіть однаковою мовою, наприклад, Швейцарія та Німеччина використовують ". і "," по-різному в цифрах. Результат -> Налаштування файлів є сміттям. Використовуйте інваріантну мову там;)
TomTom

23
Додамо до коментаря Стіва: культуру потрібно використовувати, коли вам насправді все одно, як виглядають речі (не байдуже, чи використовуються вони коми чи крапки чи що завгодно, тому що користувач ніколи цього не побачить), але вам це потрібно завжди бути однаковим (наприклад, тому що вам потрібно вміти читати те, що ви написали).
itowlson

7

Він використовується для речей, що є однаковими незалежно від культури (що не потрібно переводити на деяку культуру X, щоб відповідати)

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

Зауважте, що за документами, зв'язаними вище:

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


3
Це свідчить про те, що «Інваріантна культура» призначена лише для проміжного формату, тобто якщо ви показуєте користувачеві речі, які є результатом інваріантної культури (тобто «в» інваріантної культури), ви робите щось не так і не розуміють інваріантної культури.
mlhDev

3

Інваріантна культура нечутлива до культури; він асоціюється з англійською мовою, але не з будь-якою країною / регіоном.

CultureInfo.InvariantCulture отримує екземпляр інваріантної культури. Його можна використовувати майже в будь-якому методі в просторі імен System.Globalization, який вимагає культури.

Об'єкти, повернені такими властивостями, як CompareInfo, DateTimeFormat і NumberFormat, також відображають умовні умови порівняння та форматування інваріантної культури. Властивість InvariantCulture стане корисною, коли потрібно відображати збережені дані у форматі, незалежному від культури .

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


0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.