¿Qué significa CultureInfo.InvariantCulture?
Tengo una cadena de texto como esta:
var foo = "FooBar";
Quiero declarar una segunda cadena llamada bar
y hacerla igual al primer y cuarto carácter de mi primero foo
, así que hago esto así:
var bar = foo[0].ToString() + foo[3].ToString();
Esto funciona como se esperaba, pero ReSharper me recomienda ponerlo Culture.InvariantCulture
entre corchetes, por lo que esta línea termina así:
var bar = foo[0].ToString(CultureInfo.InvariantCulture)
+ foo[3].ToString(CultureInfo.InvariantCulture);
¿Qué significa esto? ¿Afectará la forma en que se ejecuta mi programa?
No todas las culturas utilizan el mismo formato para fechas y valores decimales/monetarios.
Esto será importante para usted cuando convierta valores de entrada ( leídos) que están almacenados como cadenas a DateTime
, o . También importará si intenta formatear los tipos de datos antes mencionados en cadenas (escribir) para mostrarlos o almacenarlos.float
double
decimal
Si sabe de antemano en qué cultura específica estarán sus fechas y valores decimales/moneda, puede usar esa CultureInfo
propiedad específica (es decir CultureInfo("en-GB")
). Por ejemplo, si espera una entrada del usuario.
La CultureInfo.InvariantCulture
propiedad se utiliza si está formateando o analizando una cadena que debería ser analizable mediante un software independiente de la configuración local del usuario.
El valor predeterminado es CultureInfo.InstalledUICulture
que CultureInfo predeterminado dependa de la configuración del sistema operativo en ejecución. Es por eso que siempre debe asegurarse de que la información cultural se ajuste a su intención (consulte la respuesta de Martin para obtener una buena guía).
- Ejemplo de CultureInfo.InvariantCulture
- CultureInfo.InvariantCulture en StackOverflow
- Artículo de MSDN CultureInfo.InvariantCulture
- Nombres predefinidos de CultureInfo
Cuando los números, las fechas y las horas se formatean en cadenas o se analizan a partir de cadenas, se utiliza una cultura para determinar cómo se hace. Por ejemplo, en la en-US
cultura dominante tienes estas representaciones de cadenas:
- 1.000.000,00 - un millón con una fracción de dos dígitos
- 29/01/2013 - fecha de esta publicación
En mi cultura ( da-DK
) los valores tienen esta representación de cadena:
- 1.000.000,00 - un millón con fracción de dos cifras
- 29-01-2013 - fecha de esta publicación
En el sistema operativo Windows, el usuario puede incluso personalizar cómo se formatean los números y las fechas/horas y también puede elegir otra cultura además de la cultura de su sistema operativo. El formato utilizado es elección del usuario y así debe ser.
Entonces, cuando formatea un valor para mostrarlo al usuario usando, por ejemplo, ToString
o String.Format
o analizado a partir de una cadena usando DateTime.Parse
o, Decimal.Parse
el valor predeterminado es usar el archivo CultureInfo.CurrentCulture
. Esto permite al usuario controlar el formato.
Sin embargo, gran parte del formateo y análisis de cadenas en realidad no son cadenas intercambiadas entre la aplicación y el usuario, sino entre la aplicación y algún formato de datos (por ejemplo, un archivo XML o CSV). En ese caso, no querrás usarlo CultureInfo.CurrentCulture
porque si el formateo y el análisis se realizan con diferentes culturas, puede romperse. En ese caso desea utilizar CultureInfo.InvariantCulture
(que se basa en la en-US
cultura). Esto asegura que los valores puedan viajar de ida y vuelta sin problemas.
La razón por la que ReSharper le da la advertencia es que algunos creadores de aplicaciones no son conscientes de esta distinción, lo que puede conducir a resultados no deseados, pero nunca lo descubren porque su programa CultureInfo.CurrentCulture
tiene en-US
el mismo comportamiento que CultureInfo.InvariantCulture
. Sin embargo, tan pronto como la aplicación se utiliza en otra cultura donde existe la posibilidad de usar una cultura para formatear y otra para analizar, la aplicación puede fallar.
Entonces, para resumirlo:
- Utilice
CultureInfo.CurrentCulture
(el valor predeterminado) si está formateando o analizando una cadena de usuario. - Úselo
CultureInfo.InvariantCulture
si está formateando o analizando una cadena que debería ser analizable mediante un software. - Rara vez se utiliza una cultura nacional específica porque el usuario no puede controlar cómo se realiza el formateo y el análisis.