Czym jest niezmienna kultura?

173

Czy ktokolwiek mógłby podać przykład, aby zademonstrować użycie niezmiennej kultury ? Nie rozumiem, co opisuje dokumentacja.

Ricky
źródło
14
Jest angielski, ale nie jest powiązany z żadnym miejscem.

Odpowiedzi:

132

Kultura niezmienna jest kulturą specjalną, która jest użyteczna, ponieważ się nie zmieni. Obecna kultura może zmieniać się od jednego użytkownika do drugiego, a nawet z jednego uruchomienia do drugiego, więc nie można polegać na tym, że pozostanie taka sama.

Możliwość korzystania z tej samej kultury za każdym razem jest bardzo ważna w kilku przepływach, na przykład serializacji: możesz mieć wartość 1,1 w jednej kulturze i 1,1 w innej. Jeśli spróbujesz przeanalizować wartość „1,1” w drugiej kulturze, analiza nie powiedzie się. Możesz jednak użyć niezmiennej kultury, aby przekonwertować liczbę na ciąg, a następnie przeanalizować ją z powrotem z dowolnego komputera z dowolnym zestawem kultur.

// 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);
Andrew Bezzub
źródło
9
Warto, to jest w System.Globalizationprzestrzeni nazw.
Jim H.,
1
To zawsze będzie działać, ponieważ serializowałeś z tą samą kulturą << to nie miało dla mnie sensu, myślę, że coś źle zrozumiałem. Jeśli używanie CultureInfo.InvariantCulturedziała, ponieważ jesteś serializowany z tą samą kulturą ... to czy nie jest to to samo, co używanie CultureInfo.CurrentCulture?
Alisson
3
@Alisson Jeśli umieścisz ostatnie dwie instrukcje kodu Andrew z powrotem w oryginalnym przepływie, myślę, że będzie to miało więcej sensu. Jeśli zawsze serializujesz używając CultureInfo.InvariantCulture, wiesz, że zawsze będziesz w stanie przeanalizować z powrotem do ułamka dziesiętnego używając CultureInfo.InvariantCulture. Jeśli używasz CultureInfo.CurrentCulturedo serializacji, Twój użytkownik może mieć „en-US” jako bieżącą kulturę. Następny użytkownik, który przejdzie do analizy z powrotem do ułamka dziesiętnego, może mieć bieżącą kulturę, która używa znaku „,” jako separatora.
David Specht
1
@Andrew Może jestem gęsty, ale nie mogłem zrozumieć, o czym mówisz, bez komentarza Davida. Zredagowałem twoją odpowiedź, aby była wyraźna.
jpaugh
111

Fałszywa kultura oparta na języku angielskim z określonym zachowaniem. Świetnie jest na przykład zapisywać rzeczy do plików konfiguracyjnych, aby można je było odczytywać i zapisywać niezależnie od kultury zdefiniowanej przez użytkownika.

Zasadniczo jest to specyficzna kultura, która jest sztuczna i nie ulegnie zmianie .

TomTom
źródło
4
W szczególności nie będziesz zaskoczony różnymi zastosowaniami przecinków i punktów w postaci ciągów liczb lub nieparzystymi konwersjami wielkości liter.
Steve Gilham
8
Tak ... typowy problem dla: * amerykańskich programistów, którzy myślą, że to słowo jest angielskie;) A potem niemieccy klienci piszą 1.000,00 za 1000;) Ała. * Nawet w tym samym języku, na przykład w Szwajcarii i Niemczech, użyj „.” i „,” na różne sposoby w liczbach. Wynik -> Pliki konfiguracyjne to śmieci. Użyj tam niezmiennego języka;)
TomTom
23
Aby dodać do komentarza Steve'a: jest to kultura, której należy używać, gdy tak naprawdę nie obchodzi cię, jak rzeczy wyglądają (nie obchodzi cię, czy używa przecinków, punktów, czy cokolwiek, ponieważ użytkownik nigdy tego nie zobaczy), ale potrzebujesz jej zawsze być takim samym (np. ponieważ musisz umieć przeczytać to, co napisałeś).
itowlson
7

Jest używany do rzeczy, które są takie same niezależnie od kultury (które nie muszą być tłumaczone na jakąś kulturę X, aby były odpowiednie)

jak na przykład - https://msdn.microsoft.com/en-us/library/4c5zdc6a(v=vs.100).aspx . Podczas pisania pliku specyficznego dla aplikacji, z którym użytkownik nie powinien się bawić, należy użyć InvariantCulture dla wszystkich metod, które przyjmują parametr kultury.

Pamiętaj, że zgodnie z dokumentami, do których link znajduje się powyżej:

Jednak aplikacja powinna używać niezmiennej kultury tylko w przypadku procesów, które wymagają wyników niezależnych od kultury, takich jak formatowanie i analizowanie danych utrwalonych w pliku.

Gishu
źródło
3
To mówi do wniosku, że kultura niezmienna ma być tylko formatem pośrednim, tj. Jeśli wyświetlasz użytkownikowi coś, co jest wynikiem niezmiennej kultury (to znaczy „w” niezmiennej kulturze), robisz coś jest nie tak i nie rozumiem niezmiennej kultury.
mlhDev
3

Kultura niezmienna jest niewrażliwa na kulturę; jest powiązany z językiem angielskim, ale nie z żadnym krajem / regionem.

CultureInfo.InvariantCulture pobiera wystąpienie niezmiennej kultury. Może być używany w prawie każdej metodzie w przestrzeni nazw System.Globalization, która wymaga kultury.

Obiekty zwracane przez właściwości, takie jak CompareInfo, DateTimeFormat i NumberFormat, również odzwierciedlają porównanie ciągów i konwencje formatowania niezmiennej kultury. Właściwość InvariantCulture jest przydatna, gdy chcesz wyświetlić trwałe dane w formacie niezależnym od kultury .

Na przykład, jeśli chcesz wyświetlić liczbę lub datę i godzinę w określonym formacie niezależnie od bieżącej kultury aplikacji, możesz użyć CultureInfo.InvariantCulture .

CharithJ
źródło
0

Jest to uniwersalny, prosty, nieregionalny język angielski i inne powiązane informacje. To jest jak język samego języka programowania. Możesz na nim polegać, konfigurując uniwersalny kalendarz; w sytuacji, gdy musisz wygenerować nazwy kontrolerów, adresy URL, nazwy delegatów ... itd. i potrzebują, aby rzeczy działały naturalnie i uniwersalnie wśród wszystkich użytkowników.

Shadi Namrouti
źródło