¿Qué significa CultureInfo.InvariantCulture?

Resuelto JMK asked hace 12 años • 5 respuestas

Tengo una cadena de texto como esta:

var foo = "FooBar";

Quiero declarar una segunda cadena llamada bary 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.InvariantCultureentre 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?

JMK avatar Mar 18 '12 23:03 JMK
Aceptado

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

Si sabe de antemano en qué cultura específica estarán sus fechas y valores decimales/moneda, puede usar esa CultureInfopropiedad específica (es decir CultureInfo("en-GB")). Por ejemplo, si espera una entrada del usuario.

La CultureInfo.InvariantCulturepropiedad 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.InstalledUICultureque 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
JohnB avatar Mar 18 '2012 17:03 JohnB

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-UScultura 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, ToStringo String.Formato analizado a partir de una cadena usando DateTime.Parseo, Decimal.Parseel 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.CurrentCultureporque 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-UScultura). 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.CurrentCulturetiene en-USel 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.InvariantCulturesi 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.
Martin Liversage avatar Jan 19 '2013 20:01 Martin Liversage