Cos'è la cultura invariante?


173

Qualcuno potrebbe fare un esempio per dimostrare l'uso della cultura invariante ? Non capisco cosa descrive la documentazione.


14
È inglese, ma non è associato a nessuna località.

Risposte:


132

La cultura invariante è una cultura speciale che è utile perché non cambierà. La cultura corrente può cambiare da un utente all'altro, o anche da una corsa all'altra, quindi non puoi fare affidamento sul fatto che rimanga lo stesso.

Essere in grado di utilizzare la stessa cultura ogni volta è molto importante in diversi flussi, ad esempio la serializzazione: è possibile avere un valore 1,1 in una cultura e 1,1 in un'altra. Se proverai ad analizzare il valore "1,1" nella seconda cultura, l'analisi fallirà. Tuttavia è possibile utilizzare la cultura invariante per convertire un numero in una stringa e successivamente analizzarlo da qualsiasi computer con qualsiasi set di cultura.

// 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
Per quello che vale, questo è nello System.Globalizationspazio dei nomi.
Jim H.

1
Funzionerà sempre perché hai serializzato con la stessa cultura << questo non aveva senso per me, penso di aver frainteso qualcosa. Se usare CultureInfo.InvariantCulturefunziona perché hai serializzato con la stessa cultura .... allora non è lo stesso che usare CultureInfo.CurrentCulture?
Alisson,

3
@Alisson Se riporti le ultime due dichiarazioni di codice di Andrew nel flusso originale, penso che avrà più senso. Se si serializza sempre usando CultureInfo.InvariantCultureallora saprai che sarai sempre in grado di tornare indietro usando un decimale CultureInfo.InvariantCulture. Se usi CultureInfo.CurrentCultureper serializzare, il tuo utente potrebbe avere "en-US" come cultura attuale. L'utente successivo che lo analizza con un decimale potrebbe avere una cultura corrente che utilizza "," per un separatore.
David Specht,

1
@Andrew Forse sono denso, ma non riuscivo a capire cosa stavi dicendo, senza il commento di David. Ho modificato la tua risposta per essere esplicito.
jpaugh,

111

Una cultura falsa basata sull'inglese con un comportamento definito. Ottimo per scrivere, ad esempio, roba in file di configurazione in modo che possa essere letto e scritto indipendentemente dalla cultura definita dall'utente.

Fondamentalmente è una cultura specifica che è artificiale e non cambierà .


4
In particolare, non sarai sorpreso da diversi usi di virgole e punti nelle forme stringa di numeri o con conversioni di casi dispari.
Steve Gilham,

8
Sì ... problema tipico per: * programmatori americani che pensano che la parola sia inglese;) e quindi i clienti tedeschi scrivono 1.000,00 per 1000;) Ahi. * Anche nella stessa lingua, ad esempio Svizzera e Germania usano "." e "," in diversi modi nei numeri. Risultato -> I file di configurazione sono spazzatura. Usa lì lingua invariante;)
TomTom

23
Per aggiungere al commento di Steve: è la cultura da usare quando in realtà non ti interessa come appaiono le cose (non ti importa se utilizza virgole o punti o altro, perché l'utente non lo vedrà mai) ma ne hai sempre bisogno per essere lo stesso (ad es. perché devi essere in grado di leggere ciò che hai scritto).
itowlson,

7

È usato per cose uguali a prescindere dalla cultura (che non ha bisogno di essere tradotto in alcune culture X per essere appropriato)

come per esempio - https://msdn.microsoft.com/en-us/library/4c5zdc6a(v=vs.100).aspx . Quando si scrive un file specifico dell'app che l'utente non deve fare confusione, è necessario utilizzare InvariantCulture per tutti i metodi che accettano un parametro di cultura.

Nota che per i documenti collegati sopra:

Tuttavia, un'applicazione deve utilizzare la cultura invariante solo per i processi che richiedono risultati indipendenti dalla cultura, come la formattazione e l'analisi dei dati persistenti in un file.


3
Questo parla al corollario che la cultura invariante intende essere solo un formato intermedio, cioè se stai mostrando cose all'utente che è l'output della cultura invariante (cioè, "nella" cultura invariante), stai facendo qualcosa di sbagliato e non capire la cultura invariante.
mlhDev

3

La cultura invariante è insensibile alla cultura; è associato con la lingua inglese ma non con nessun paese / regione.

CultureInfo.InvariantCulture recupera un'istanza della cultura invariante. Può essere utilizzato in quasi tutti i metodi nello spazio dei nomi System.Globalization che richiede una cultura.

Gli oggetti restituiti da proprietà come CompareInfo, DateTimeFormat e NumberFormat riflettono anche le convenzioni sul confronto delle stringhe e sulla formattazione della cultura invariante. La proprietà InvariantCulture è utile quando si desidera visualizzare i dati persistenti in un formato indipendente dalla cultura .

Ad esempio, se si desidera visualizzare un numero o un datetime in un formato specifico indipendentemente dalla cultura corrente dell'applicazione, è possibile utilizzare CultureInfo.InvariantCulture .


0

Si tratta di una lingua inglese semplice non specifica per regione e di altre informazioni correlate. È come il linguaggio del linguaggio di programmazione stesso. Puoi fare affidamento su di esso nella creazione di un calendario universale; in situazioni in cui è necessario generare nomi di controller, URL, nomi di delegati ... ecc. e hanno bisogno di cose per agire in modo naturale e universale tra tutti gli utenti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.