.net - notes - resharper news




Che cosa significa CultureInfo.InvariantCulture? (4)

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?


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).


Quando numeri, date e ore sono formattati in stringhe o analizzati da stringhe, viene utilizzata una cultura per determinare come viene eseguita. Ad esempio nella cultura en-US dominante hai queste rappresentazioni di stringa:

  • 1.000.000,00 - un milione con una frazione di due cifre
  • 29/01/2013 - data di questo intervento

Nella mia cultura ( da-DK ) i valori hanno questa rappresentazione di stringa:

  • 1.000.000,00 - un milione con una frazione di due cifre
  • 29-01-2013 - data di questo intervento

Nel sistema operativo Windows l'utente può persino personalizzare il modo in cui numeri e data / ora sono formattati e può anche scegliere un'altra cultura rispetto alla cultura del suo sistema operativo. La formattazione utilizzata è la scelta dell'utente che è come dovrebbe essere.

Pertanto, quando si formatta un valore da visualizzare all'utente utilizzando, ad esempio, ToString o String.Format o analizzato da una stringa utilizzando DateTime.Parse o Decimal.Parse impostazione predefinita viene utilizzato CultureInfo.CurrentCulture . Ciò consente all'utente di controllare la formattazione.

Tuttavia, un sacco di formattazione e analisi delle stringhe non sono in realtà stringhe scambiate tra l'applicazione e l'utente, ma tra l'applicazione e alcuni formati di dati (ad esempio un file XML o CSV). In tal caso non si desidera utilizzare CultureInfo.CurrentCulture perché se la formattazione e l'analisi vengono eseguiti con culture diverse, possono interrompersi. In tal caso, si desidera utilizzare CultureInfo.InvariantCulture (che si basa sulla cultura en-US ). Ciò garantisce che i valori possano andare in giro senza problemi.

La ragione per cui ReSharper ti dà l'avvertimento è che alcuni scrittori di applicazioni non sono consapevoli di questa distinzione che può portare a risultati non intenzionali ma non lo scoprono mai perché il loro CultureInfo.CurrentCulture è en-US che ha lo stesso comportamento di CultureInfo.InvariantCulture . Tuttavia, non appena l'applicazione viene utilizzata in un'altra cultura in cui esiste la possibilità di utilizzare una cultura per la formattazione e un'altra per l'analisi dell'applicazione potrebbe interrompersi.

Quindi riassumendo:

  • Usa CultureInfo.CurrentCulture (il valore predefinito) se stai formattando o analizzando una stringa utente.
  • Utilizza CultureInfo.InvariantCulture se stai formattando o analizzando una stringa che dovrebbe essere analizzabile da un software.
  • Raramente si utilizza una cultura nazionale specifica perché l'utente non è in grado di controllare come viene eseguita la formattazione e l'analisi.

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.







resharper