.net resharper - Che cosa significa CultureInfo.InvariantCulture?




free c++ (5)

Secondo Microsoft:

La proprietà CultureInfo.InvariantCulture non è né una cultura neutrale né una cultura specifica. È un terzo tipo di cultura che è insensibile alla cultura. È associato alla lingua inglese ma non a un paese o una regione.

(da http://msdn.microsoft.com/en-us/library/4c5zdc6a(vs.71).aspx )

Quindi InvariantCulture è simile alla cultura "en-US" ma non esattamente la stessa. Se scrivi:

var d = DateTime.Now;
var s1 = d.ToString(CultureInfo.InvariantCulture);   // "05/21/2014 22:09:28"
var s2 = d.ToString(new CultureInfo("en-US"));       // "5/21/2014 10:09:28 PM"

quindi s1 e s2 avranno un formato simile, ma InvariantCulture aggiunge zero iniziali e "en-US" utilizza AM o PM.

Quindi InvariantCulture è migliore per l'uso interno, quando ad esempio si salva una data in un file di testo o si analizzano i dati. E un CultureInfo specificato è migliore quando si presentano dati (data, valuta ...) all'utente finale.

Ho una stringa di testo in questo modo:

var foo = "FooBar";

Voglio dichiarare una seconda stringa chiamata bar e renderla uguale al primo e al quarto carattere del mio primo foo , quindi lo faccio in questo modo:

var bar = foo[0].ToString() + foo[3].ToString();

Funziona come previsto, ma ReSharper mi consiglia di inserire Culture.InvariantCulture nelle mie parentesi, quindi questa riga termina in questo modo:

var bar = foo[0].ToString(CultureInfo.InvariantCulture)
        + foo[3].ToString(CultureInfo.InvariantCulture);

Cosa significa questo e influirà sul modo in cui viene eseguito il mio programma?


Per cose come i numeri (punti decimali, virgole in quantità), di solito sono preferiti nella cultura specifica.

Un modo appropriato per farlo sarebbe impostato a livello di cultura (per tedesco) come questo:

Thread.CurrentThread.CurrentCulture.NumberFormat = new CultureInfo("de").NumberFormat;

JetBrains offre una explanation ragionevole, ma se sto lavorando su un sito che so sarà solo in inglese, ignoro semplicemente il suggerimento.


Non tutte le culture utilizzano lo stesso formato per le date e i valori decimali / valutari.

Ciò sarà importante per te quando stai convertendo i valori di input (leggi) memorizzati come stringhe su DateTime , float , double o decimal . Importerà anche se si tenta di formattare i suddetti tipi di dati su stringhe (scrittura) per la visualizzazione o l'archiviazione.

Se si conosce la cultura specifica in cui le date e i valori decimali / valutari saranno in anticipo, è possibile utilizzare la specifica proprietà CultureInfo (ad esempio CultureInfo("en-GB") ). Ad esempio se ti aspetti un input da parte dell'utente.

La proprietà CultureInfo.InvariantCulture viene utilizzata se si esegue la formattazione o l'analisi di una stringa che deve essere analizzabile da una parte di software indipendente dalle impostazioni locali dell'utente.

Il valore predefinito è CultureInfo.InstalledUICulture quindi il valore CultureInfo predefinito dipende dalle impostazioni del sistema operativo in esecuzione. Questo è il motivo per cui dovresti sempre assicurarti che le informazioni sulla cultura si adattino alle tue intenzioni (vedi la risposta di Martin per una buona guida).


È stato coperto sopra; tuttavia, non è possibile utilizzare la string in reflection; devi usare String .





.net resharper