2010-03-11 21 views

risposta

103

La cultura invariante è una cultura speciale che è utile perché non cambierà. La cultura attuale può cambiare da un utente a un altro o persino da una corsa all'altra, quindi non si può 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 tenterai di 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 riprenderlo 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); 
+8

Per quello che vale, questo è nello spazio dei nomi 'System.Globalization'. –

+0

* Funzionerà sempre perché è stato serializzato con la stessa cultura * << questo non aveva senso per me, penso di aver frainteso qualcosa. Se si usa 'CultureInfo.InvariantCulture' funziona perché si è serializzato con la stessa cultura .... allora non è lo stesso che usare' CultureInfo.CurrentCulture'? – Alisson

+1

@Alisson Se metti le ultime due istruzioni di codice di Andrew nel flusso originale, penso che avrà più senso. Se serializzi sempre usando 'CultureInfo.InvariantCulture', sai che sarai sempre in grado di analizzare un decimale usando' CultureInfo.InvariantCulture'. Se usi 'CultureInfo.CurrentCulture' per serializzare, il tuo utente potrebbe avere" en-US "come cultura corrente. Il prossimo utente che passa ad analizzare nuovamente un decimale potrebbe avere una cultura corrente che utilizza "," per un separatore. –

96

Una cultura fittizia basata sull'inglese con un comportamento definito. Ottimo per scrivere, ad esempio, materiale nei file di configurazione in modo che possa essere letto e scritto indipendentemente dalla cultura che l'utente ha definito.

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

+4

In particolare, non verrai escluso da diversi usi di virgole e punti nelle forme di stringa dei numeri o con le conversioni di caso dispari. –

+6

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

+16

Per aggiungere al commento di Steve: è la cultura da utilizzare quando non ti interessa realmente come * le cose * * (non ti importa se usa virgole o punti o altro, perché l'utente non lo vedrò mai) ma è necessario che sia sempre lo stesso (ad esempio perché devi essere in grado di leggere ciò che hai scritto). – itowlson

6

È usato per cose che è lo stesso indipendentemente dalla cultura (che non ha bisogno di essere tradotte certa cultura X sia appropriato)

come per esempio - https://msdn.microsoft.com/en-us/library/4c5zdc6a(v=vs.100).aspx. Quando scrivi un file specifico per app con cui l'utente non deve fare a meno, devi utilizzare InvariantCulture per tutti i metodi che contengono un parametro cultura.

Si noti che per i documenti legati sopra:

Tuttavia, un'applicazione dovrebbe utilizzare la cultura invarianti solo per processi che richiedono risultati della coltura-indipendenti, come la formattazione ei dati di analisi che viene mantenuto in un file.

+2

Questo parla del corollario che la cultura invariante è solo intesa come un formato intermedio, cioè se stai visualizzando roba all'utente che è l'output della cultura invariante (cioè, nella cultura invariante), sei fare qualcosa di sbagliato e non capire la cultura invariante. – mlhDev

2

La cultura invariante è insensibile alla cultura; è associato alla lingua inglese ma non a nessun paese/regione. È possibile utilizzare la cultura invariante per le operazioni stringa sensibili alla cultura che non sono influenzate dalle convenzioni della cultura corrente del thread e che sono coerenti tra le culture.

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à quali CompareInfo, DateTimeFormat e NumberFormat riflettono anche le convenzioni della stringa di confronto e formattazione della cultura invariabile.

differenza dei dati sensibili coltura-, che è soggetta a modifiche dall'utente personalizzazione o aggiornamenti .NET Framework o il sistema operativo , cultura dati invarianti è stabile nel tempo e tra culture installate e non possono essere personalizzato utenti. Ciò rende la coltura invariante particolarmente utile per operazioni che richiedono risultati indipendenti dalla cultura , come le operazioni di formattazione e analisi che persistono in dati formattati o operazioni di ordinamento e ordinamento che richiedono che i dati vengano visualizzati in un ordine fisso indipendentemente dalla coltura.

La proprietà InvariantCulture molto utile quando si desidera visualizzare persistono i dati in un formatocultura indipendente.

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

+0

-1 perché sicuramente non capirò la maggior parte di questa spiegazione senza aver già letto quelli sopra. Non è chiaro, a mio parere, quali siano le "operazioni di stringa sensibili alla cultura che non sono influenzate dalle convenzioni della cultura corrente e che sono coerenti tra le culture" * sono destinate a essere, e non sono ancora sicuro al 100% cosa intendevi scrivere nella frase dopo la citazione (* "mostra i dati persistenti" * è chiaramente un refuso, ma non so per cosa). –

Problemi correlati